1

Neo4j を使用して、組織の概念実証に取り組んでいます。例として、会社の管理階層 (誰が誰を管理するか、誰が X によって管理されるかなど) をモデル化することにしました。グラフではうまくいくようですが、表示したい方法でNeo4jからデータを取り戻す方法が見つかりません。

私が必要とするクエリは次のとおりです。X 氏に報告する全員に、ずっと下まで教えてください。つまり、Xに直接報告するすべての人、およびXに報告するすべての人など.

Cypher でそれを実行できるようですが、平坦化された 2 次元の結果が返されます。しかし、それは結果の管理構造を説明していないため、あまり役に立ちません。

私が本当に欲しいのは、人々のグラフです。これは、すべてのレベルの管理に対してクエリを実行せずに実行できますか?

私は C# Neo4JClient を使用していますが、現時点ではどのソリューションにも興味があります。

4

2 に答える 2

3

すべてのパスをX構造のルートに戻すことができます。

start x=node:people(name='foo')
match path = x<-[:REPORTS_TO*]-person
return path

パス コレクションの式、、または述語、、を返すnodes(path)か、使用することもできます。rels(path)filterlengthextractALLANYSINGLENONE

于 2012-09-17T23:44:13.710 に答える
0

これは、ツリーを抽出するための私のソリューションです:

注:このソリューションは私のプロジェクトで機能しますが、他にも不要な制約があるため、質問のために変更する必要がありました。

抽出するすべてのルート エンティティを見つけた後、

With entity as rootEntity

これらの一致をクエリに追加しました。

match
    rootEntity-[*0..]->subEntity, 
    parentEntity-->subEntity

そしてこれは:

where rootEntity = subEntity or (rootEntity-[*0..]->parentEntity)

次に、次のようにデータを(個別に)返しました:

id(rootEntity), 
id(parentEntity),
id(entity),
subEntity

ソリューションの残りの部分は C# です。

NEO4J はルート エンティティを数回返すため、最初にいくつかのデータ修正が必要です (着信リレーションシップごとに 1 回)。

results.ForEach(
        x =>
        {
            if (x.Id == x.RootId)
                x.ParentId = 0;
        });

Id で区別:

results =
    results
    .GroupBy(x => x.Id)
    .Select(x => x.First())
    .ToList();

次に、ツリーを構築できます。

    ....
    var trees = results
        .GroupBy(x => x.RootId)
        .Select(singleTreeEntities => GenerateSingleEntity(singleTreeEntities.Key, singleTreeEntities))

    return trees;
}

private Entity GenerateSingleEntity(long id, IEnumerable<Entities> treeEntities)
{
    var currEntity = treeEntities.SingleOrDefault(x => x.Id == id);

    return new Entity
    {
        Id = id,
        SomeData = currEntity.SubEntity.SomeData,
        SomeOtherData = currEntity.SubEntity.SomeOtherData,
        ChildEntities =
            treeEntities
                .Where(x => x.ParentId == id)
                .Select(x => GenerateSingleEntity(x.Id, treeEntities)))
    };
}
于 2013-05-26T11:27:03.910 に答える