[英]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)
或使用路徑集合中的任何表達式filter
, length
, extract
或謂詞ALL
, ANY
, SINGLE
, NONE
。
這是我提取樹的解決方案:
注意:此解決方案適用於我的項目,但我必須為您的問題更改它,因為我們有一些其他不必要的約束。
找到所有提取的根實體后,
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.