親に 0 個以上の子があり、子に 1 つまたは 0 個の親がある階層ツリー構造で作業しています。特定の親の直接の子のリストをクエリすると、クエリは子をランダムな順序で返します。子を作成または更新するときに、定義した順序で子を返す必要があります。
私は子の間の関係を追加しました -[:Sibling]-> そのため、「上」の兄弟は着信 :Sibling 関係のみを持ち、「下」の兄弟は発信関係のみを持ちます。
これを考えると、子供を兄弟順に返す Cypher クエリはありますか?
各子とその兄弟を返すクエリがありますが、正しい順序でリストを返すコードを記述する必要があります。
別の方法として、各子ノードにソート番号を追加することもできます。そのうちの 1 つが順序を変更した場合、すべての子に対してこれを更新する必要があります。このアプローチは、グラフ データベースの概念とは少し異なります。
この問題が以前に発生したことがある場合、プログラムで解決するための標準アルゴリズムはありますか?
アップデート1
ブルーノが要求したサンプルデータ
(parent1)
(child1)-[:ChildOf]->(parent1)
(child2)-[:ChildOf]->(parent1) (child2)-[:Sibling]->(child1)
(child3)-[:ChildOf]->(parent1) (child3)-[:Sibling]->(child2)
その順序でchild1、child2、child3を返す暗号クエリはありますか?
そうでない場合、順序付けはプログラムで行うことができます
リレーションシップの代わりにプロパティを使用する
(parent1)
(child1)-[:ChildOf]->(parent1) (child1:{order:1})
(child2)-[:ChildOf]->(parent1) (child2:{order:2})
(child3)-[:ChildOf]->(parent1) (child3:{order:3})
`match (c)-[:ChildOf]->(parent1) return c ordered by c:order`
子の順序を更新できる暗号クエリがあるとは思いません。
Update2
私は今、正しい順序で子を返す次のクエリにたどり着きました
`match (firstChild)-[:FirstChildOf]->(parent) match (sibling)-[:Sibling*]->(firstChild) return firstChild,sibling`
このクエリは、-[:FirstChildOf]->(parent) 関係の追加に依存します。
他に聞こえない場合は、これを答えに設定します。
ノードを順序付けられたリストに挿入するための暗号クエリはないと仮定しますか?