これは、ツリーを抽出するための私のソリューションです:
注:このソリューションは私のプロジェクトで機能しますが、他にも不要な制約があるため、質問のために変更する必要がありました。
抽出するすべてのルート エンティティを見つけた後、
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)))
};
}