ノードの数百万のグラフ(20の長さまでも)メモリのオーバーフローを引き起こす可能性があるすべての可能な経路を見つけることを試みます。
あなたができることは、より小さなセグメントに分割することです。クエリはエレガントではありませんが、うまくいくはずです。
我々は一度に5の経路長をしている場合たとえば、2セグメントのクエリは次のようになります。
MATCH p1 = (n1:Label)-[r1*..5]-(n2:Label), p2 = (n2:Label)-[r2*..5]-(n3:Label)
WHERE all(x1 in nodes(p1) WHERE (x1:Label))
AND all(x2 in nodes(p2) WHERE (x2:Label))
RETURN r1, r2
このクエリのコストプランがそうのようになります。
+-----------------------+----------------------+---------------------+
| Operator | Variables | Other |
+-----------------------+----------------------+---------------------+
| +ProduceResults | r1 | r1 |
| | +----------------------+---------------------+
| +Filter | n1, n2, n3, r1, r2 | [see below] |
| | +----------------------+---------------------+
| +VarLengthExpand(All) | n1, r1 -- n2, n3, r2 | (n2)-[r1:*..5]-(n1) |
| | +----------------------+---------------------+
| +Filter | n2, n3, r2 | n3:Label |
| | +----------------------+---------------------+
| +VarLengthExpand(All) | n3, r2 -- n2 | (n2)-[r2:*..5]-(n3) |
| | +----------------------+---------------------+
| +NodeByLabelScan | n2 | :Label |
+-----------------------+----------------------+---------------------+
最初の展開の直後に、フィルタが開始されずに終了するファイルが:Label
でフィルタリングされ、次に2番目の展開が行われることがわかります。
あなたのNeoバージョンが2.2以上で、p1
とp2
will not include the same relationshipsの間です。
あなたが実際にこのフィルタリングはProduceResults
演算子(第2ライン)前のフィルタで行わ見ることができます:今、あなたはまた、我々はそれだけで最後のフィルタにパス内のすべてのノードをチェックすることを確認する必要があり
all(x1 in NodesFunction(ProjectedPath(Set(r1, n1),)) where x1:Label)
AND none(r1 in r1 where any(r2 in r2 where r1 == r2))
AND n1:Label
を。したがって、このようなパス(a:Label) - (b:Blah) - (c:Label)は最初のセグメントを通過し、結果生成前にのみフィルタリングされます。
したがって、すべてのセグメントノードが:Label
になっていることを確認してさらに最適化することができます。同様の過去の関係を手動でチェックします。第2段階のみを表示:
WITH n2, r1
MATCH p2 = (n2:Label)-[r2*..5]-(n3:Label)
WHERE all(x2 in nodes(p2) WHERE (x2:Label))
AND none(r1 in r1 where any(r2 in r2 where r1 == r2))
私は言及を忘れましたが、そのようなクエリは怠惰な方法で実行されることを覚えておいてください。
これは計算が難しいクエリです。 REL_TYPE1 | REL_TYPE2'(可能な関係タイプを列挙する)を 'MATCH'に入れます。2. APOCライブラリの[パスエキスパンダー](https://neo4j-contrib.github.io/neo4j-apoc-procedures/#_path_expander)。 –