簡體   English   中英

我可以將Neo4J查詢結果作為圖表返回嗎?

[英]Can I get Neo4J query results back as a graph?

我正在使用Neo4j為我的組織進行概念驗證。 作為一個例子,我選擇模擬公司管理層次結構(誰管理誰,誰由X管理等)。 看起來它在圖形中可以很好地工作,但是我找不到任何方法以我希望顯示的方式將數據從Neo4j中取出。

我需要的查詢是: 告訴我每個人向人X報告,一直向下。 這意味着,每個直接向X報告的人以及向他們報告的任何人等。

我看到我可以在Cypher中做到這一點,但它會返回一個扁平的2d結果。 但這並不是很有幫助,因為它沒有描述結果的管理結構。

看起來我真正想要的是人們一路下來的圖表。 這可以在不對每個級別的管理進行查詢的情況下完成嗎?

我正在使用C#Neo4JClient,但此時我對任何解決方案感興趣。

您可以返回結構的根X的所有路徑。

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

您還可以返回nodes(path)rels(path)或使用路徑集合中的任何表達式filterlengthextract或謂詞ALLANYSINGLENONE

這是我提取樹的解決方案:

注意:此解決方案適用於我的項目,但我必須為您的問題更改它,因為我們有一些其他不必要的約束。

找到所有提取的根實體后,

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將多次返回根實體(每個傳入關系一個):

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)))
    };
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM