2016-05-08 6 views
0

Neo4jでcypherを使用して、ノードグループ間の最短距離を取得する方法があるかどうかを調べようとしています。Cypherを使用してノードセット間の最短距離を検索する方法

この検索にはいくつかの注意が必要です。
- 距離はノード間の関係のプロパティです。距離の値はメートル単位です。
- すべてのノードは、指定された距離でそれらの間の関係を持ちます。
- 後続の開始ノードと終了ノードは同じノードでなければなりません。

 
MATCH 
(root) -[root_p1:PATH_TO]-> (p1), (root) -[root_p2:PATH_TO]-> (p2), (root) -[root_p3:PATH_TO]-> (p3), (p1) -[p1_root:PATH_TO]-> (root), (p1) -[p1_p2:PATH_TO]-> (p2), (p1) -[p1_p3:PATH_TO]-> (p3), (p2) -[p2_root:PATH_TO]-> (root), (p2) -[p2_p1:PATH_TO]-> (p1), (p2) -[p2_p3:PATH_TO]-> (p3), (p3) -[p3_root:PATH_TO]-> (root), (p3) -[p3_p1:PATH_TO]-> (p1), (p3) -[p3_p2:PATH_TO]-> (p2) 
WHERE ID(root) = 10 AND ID(p1) = 1 AND ID(p2) = 2 AND ID(p3) = 3 
. 
. 
. 

そして結果は最短パスを取得するために貢献するノードの正しい順序でなければなりません:

これは私がしたい入力の種類です。

+1

出力に何が表示されるべきかは不明です。あなたが入力データの例と望みの結果をもたらすならば、より良いでしょう。 –

答えて

0

このクエリでは、あなたが必要と合うかもしれません:

MATCH p=(n)-[rels:PATH_TO*]->(n) 
WITH p, REDUCE(s = 0, x IN rels | s + x.distance) AS dist 
WITH p, MIN(dist) AS d 
ORDER BY d 
LIMIT 1 
RETURN RELATIONSHIPS(p), d; 

それはPATH_TO関係を持つすべての有向巡回パスを見つけました。各パスの合計距離を計算します。最短距離で1つのパス(潜在的に多くのものか​​ら)を取得します。総距離とともにその関係のすべてを返します。

注:このクエリは、大きなグラフでは非常に時間がかかることがあります。そうであれば、可変長パターンに合理的な上限を置くことができます。たとえば、[rels:PATH_TO*][rels:PATH_TO*..5]に置き換えます。

関連する問題