2017-03-27 18 views
5

Neoに5億のノードとエッジを持つグラフがあります。スーパーノードを避ける2つのノード間の最短経路を見つけたいと思います(スーパーノードを持つパスよりも長い場合でも)。Neo4jのスーパーノードのない最短経路

以下のクエリは、小さいグラフの罰金に動作しますが、決して私が扱っていたサイズのグラフの終了:

MATCH (n:Node { id:'123'}),(m:Node { id:'234' }), p = shortestPath((n)-[*..6]-(m)) 
WHERE NONE(x IN NODES(p) WHERE size((x)--())>1000) 
RETURN p 

句それは超高速でWHERE私が削除した場合。通常、秒未満です。

どのように高速化できますか?ノードの度合いを事前に計算し、それらを索引付けすると役立つでしょうか?私はスーパーノードに隣接するものとは別にすべての辺を複製して、それらに新しいラベルを与え、WHERE句のない最短のパスのクエリにそれらを使用することに頼るべきですか?その他の提案はありますか?

+0

? どこにもない(xのノード(p)WHEREサイズ((x) - ())> 1000) –

+0

良い点。申し訳ありませんが、実際にはWHERE句にラベルを付けずにテストしていました。最初のラベルではエラーです。 2番目のラベルは違いはありません。私の質問を更新してラベルを削除しましょう。参照のためにそれはもともとこのように見えた: WHERE NONE(x:ノードのNODES(p)WHEREサイズ((x:ノード) - ())> 1000) – Tom

答えて

2

限り、WHERE ALLにはノード(ノードではない)のみが含まれている場合、Neo4jの最短パスの実装プルーンパスを伝えることができます。クエリをプルーニングできない場合は、すべてのパスが検索され、フィルタリングされます(遅い)。

MATCH (x:Node) 
WHERE size((x)--())>1000 
SET n:Supernode 

そしてエッジを介して、ノードのラベルを調べる::これはのNeo4jは最適化され、双方向を使用できるようになります

MATCH p = shortestPath((n:Node { id:'1'})-[*..6]-(m:Node { id:'2' })) 
WHERE ALL(rel IN relationships(p) WHERE not (startNode(rel):Supernode or endNode(rel):Supernode)) 
RETURN p 

としてマーティンはあなたがラベルを追加することができますと言います、幅優先(高速)クエリ

ここではいくつかのより多くの読書:ラベルを削除するとどうなりますか https://neo4j.com/docs/developer-manual/current/cypher/execution-plans/shortestpath-planning/

2

また、スーパーノードのラベルを追加しようとすることができます:

MATCH (x:Node) 
WHERE size((x)--())>1000 
SET n:Supernode 

は、あなたのデータにこの実行と仕上げをしていますか?いくつのスーパーノードとノーマルノードがありますか?

次に試してみてください。

MATCH (n:Node { id:'123'}),(m:Node { id:'234' }) 
WITH n, m 
MATCH p = shortestPath((n)-[*..6]-(m)) 
WHERE NONE(x IN NODES(p) WHERE (x:Supernode)) 
RETURN p 

を私はラベルのチェックが高速であると仮定します。

+0

ありがとう。これで問題は解決しませんが、それは便利です。だから私はほぼ0.5Gのノードを持っています。スーパーノードにラベルを付けるために9 mで最初のクエリを実行することができました。それらのうちの525個(すなわち、度> 1k)。 残念ながら、ノードnとmの間にスーパーノードが存在する場合、2番目のクエリには依然として時間がかかります。私が見る限り、それらのノードの近くにスーパーノードがなければ、非常に高速です。 – Tom

関連する問題