接続されているすべてのノードを取得するためのパフォーマンスの高い方法を探しています。しかし、ひねりがあります。特定の関係タイプを介して接続されているノードとその結果の子を除外したいと思います。
添付の図は私の場合を示しています。
ノードのクラスターが2つ以上あります。クエリ内のIDに応じて、単一のクラスターのすべてのノードを取得したいと思います。(異なるクラスターからの)他のすべてのノードおよび「LINK ...」関係を介して接続されたノードは含まれません。
接続されているすべてのノードを次の方法で取得する方法を知っています。
MATCH (n:MyNode {id : 123})-[*]-(connectedNodes) RETURN connectedNodes
WHERE
句を使用したフィルタリングは、グラフ全体をフェッチするため、悪い考えのように聞こえます。APOCの手順の中に、そのような方法で何かを行うことができる何かがあるのでしょうか。すでにあなたの助けをどうもありがとう。
編集1:ソファコメントで与えられた最初の提案を試しましたが、実行時間は十分ではありませんでした。結局、リレーションシップとノードタイプを制限しようと思います。また、再帰関数を使用してPython内でカスタム実装を試しました。まだ確定していません。
編集2:@InverseFalconの提案がうまくいったのは魅力が好きだった。最初に、考慮されない1回の使用可能なすべての関係タイプをフィルタリングapoc.path.subgraphNodes
してから、それぞれの開始ノードと有効な関係タイプを使用して手順を適用します。ありがとうございました。
Tezraの回答にはいくつかの良い点があり、DISTINCTconnectedNodesを返したいと思うでしょう。そうしないと重複が発生しますが、高度に接続されたグラフでは、Cypherが関心を持っているため、ノードの数によっては時間がかかる(またはハングする)場合があります。一致する可能性のあるすべてのパス。これはすぐに制御不能になる可能性があります。
APOCの場合、このケースを処理できますが、Tezraが述べたように、関係をブラックリストに登録する方法はありません。また、それがあったとしても、関係タイプの部分的な名前に基づいてブラックリストに登録する方法はありません。
使用する必要があるアプローチは、最初にすべての関係タイプを取得してから、で始まるものをすべて削除しLINK
、残りの関係のリストを|
分離された文字列に結合することです。次に、それを関係フィルターに渡すことができます。
CALL db.relationshipTypes() YIELD relationshipType
WHERE NOT relationshipType STARTS WITH 'LINK'
WITH collect(relationshipType) as relTypes
WITH apoc.text.join(relTypes, '|') as relTypesString
MATCH (n:MyNode {id : 123})
CALL apoc.path.subgraphNodes(n, {relationshipFilter:relTypesString}) YIELD node
RETURN node as connectedNode
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加