0

2 つのノード間のすべてのパス (最大長まで) を見つける方法を見つけるのに何日も苦労していますが、Neo4j によるパスの探索は、探索される関係を (それらのプロパティの 1 つによって) 並べ替えることによって制御します。

明確にするために、最大長が 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() 関数への入力として与えることにより)。しかし今、Bolt または REST API を使用してサーバー モードのデータベース アクセスでこれを行う方法を見つけようとしています。

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

4

2 に答える 2

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;
于 2016-06-25T16:28:41.660 に答える