2017-12-05 8 views
1

内の他のノードに同一の関係を有するノード間のリンクされたリストの関係を作成この図のようにのNeo4j

Data model

それと関係[:R]を共有するすべての(:B)ノード間のリンクされたリストの関係を作成することが可能です同じ(:A)ノード、データベース内のすべての(:A)ノード。順序が重要である場合は、すべて(:B)ノードにプロパティorderがあるとします。

+1

問題の解決方法を示します。何がうまくいかなかったのですか? –

答えて

1

私は、あなたが各:Bノードにorderのプロパティを持っていると仮定しています。

CREATE (a1:A)-[:R]->(:B {order : 1}), (a1)-[:R]->(:B {order : 2}), (a1)-[:R]->(:B {order : 3}) 
CREATE (a2:A)-[:R]->(:B {order : 1}), (a2)-[:R]->(:B {order : 2}), (a2)-[:R]->(:B {order : 3}) 

はその後あなたがこのサイファークエリを使用することができます:私は、このサンプルデータを使用してい

// match pairs of :B when b2.order is equal to b1.order plus one 
MATCH (a:A)-[:R]->(b1:B), (a)-[:R]->(b2:B) 
WHERE b2.order = b1.order + 1 
// Create the relation between :B nodes 
CREATE (b1)-[:NETX]->(b2) 

は、出力は次のようになります。

enter image description here

+0

ありがとうございました! – Bria

+0

@Briaよろしくお願いします! –

0
MATCH (A:A)-[:R]->(B:B) 
WITH A, 
    B 
ORDER BY B.order ASC // Comment out this line if the order is not important 
WITH A, 
    collect(B) as bnodes // List of all nodes of the desired type 
UNWIND RANGE(0, size(bnodes)-2) as i // Go through all the nodes except the last one 
WITH bnodes[i] as B, 
    bnodes[i+1] as BN 
CREATE (B)-[:NEXT]->(BN) 
1

1つの追加オプションを:APOC Proceduresを使用してください。プロシージャーapoc.nodes.link()は、ノードの集合を取り込み、指定された関係タイプを使用してリンクされたリストにします。使用例:

MATCH (A:A)-[:R]->(B:B) 
WITH A, B 
ORDER BY B.order ASC 
WITH A, collect(B) as bNodes 
CALL apoc.nodes.link(bNodes, 'NEXT') 
+0

このシナリオでは@ stdob-approachには利点がありますか? – Bria

+0

私は 'apoc'の方がよりパフォーマンスが良いはずだと思っています。より大きなテストデータセットで両方をテストしたいかもしれません。また、PROFILEを実行して、行数とdbヒット数がどのように変化するかを監視しますが、プロシージャ・コールではdbヒットをレポートしないことに注意してください。 – InverseFalcon

関連する問題