2016-06-25 9 views
0

2つのノード間のすべてのパスを見つける方法を見つけるのに苦労していますが、Neo4jによるパス探索は、彼らの特性の一つによって探検された。Neo4j Cypherは、ソートされた関係を探索するすべてのパスを見つける

だから、明確にするために、私は最大長M.クエリは次のようになりますまで、2つのノード間のK最良のパスを見つけたいと言うことができます:これまでのところ

match (source{name:"source"}), (target{name:"target"}), 
p = (source)-[*..M]->(target) 
return p order by length(p) limit K; 

とても良いです。しかし、パスの関係に「優先度」というプロパティがあるとします。私が望むのは、パス探索の各ステップでNeo4jに最初に探究すべき関係を伝えるクエリを書くことです。

私は、Javaライブラリと組み込みデータベースを使用すると(PathExpanderインターフェイスを実装し、それをJavaのGraphAlgoFactory.allSimplePaths()関数への入力として与えることで可能になることが分かります。 しかし、今私はボルトやRESTのAPIを使用してサーバーモードのデータベースアクセスでこれを行う方法を見つけようとしています。

サーバーモードでこれを行う方法はありますか?または、サーバーモードでグラフにアクセスしているときにJavaライブラリ関数を使用していますか?

+0

どうAPOC' 'については? https://github.com/neo4j-contrib/neo4j-apoc-procedures#graph-algorithms-work-in-progress –

+0

私はそれをチェックしました、それは私が欲しいものはしませんが、とにかく感謝! –

答えて

1
  1. 使用ラベルとあなたの2開始ノード
  2. を見つけるために、インデックス、おそらくそれは速く

作るためにallShortestPathsを検討し、この試してみてください。

match (source{name:"source"}), (target{name:"target"}), 
p = (source)-[rels:*..20]->(target) 
return p, reduce(prio=0, r IN rels | prio + r.priority) as priority 
order by priority ASC, length(p) 
limit 100; 
+0

私はそれが私が欲しいものを正確にやらないことに恐れています。実際には、関係を並べ替えることによって、トラバーサルをターゲットに向けてパフォーマンスを向上させたいと思います。このクエリは何をしません。 実際に私が望むのは、パフォーマンスの良い大きなグラフの中で最良のKパス(必ずしも最短パスではない)を見つけることですが、質問に書かれたようなクエリを実行すると、非常に長い時間待つことになります。 –

関連する問題