2013-11-04 30 views
6

私はお互いを持つプロパティ「で」= STATUSと関係を持っているノード間のすべての最も長いパスを見つけCYPHERクエリを書きたい、これは私がこれまでにやっていることです:cypherクエリで最長のパスを見つける方法

start n=node(*) 
match p = n-[r:INCLUDE*..]->m 

with n,MAX(length(p)) as l 
match p = n-[r:INCLUDE*..]->m 
WHERE all(rel in r 
where rel.status='on' AND (length(p) = l)) 
return p,l 

それは3を返します。私の最初のWHERE条件(where rel.status='on')にどのスーツ8つのパスがある場合は1,2と3の長さとパスだけでなく、最長パス、私のクエリは1,2の長さで、私が意味する、唯一の最も長いパスを見つける必要があり、 3,3,4,6,6,6の場合、長さが6の3つのパスのみが返されます。

私が何をしshoud?

私を導いてください、私はのNeo4jに新しいですし、多くのことを試みたが、めまい以外のものを持っていない、私はあなたの助けのためにとても感謝してます。

答えて

12

は、最初のパスの試合にあなたの関係プロパティの基準を移動してみてください、またはあなたがその基準でフィルタリングされていないパス上の最大の長さを計算することがあります。次に、すべてのパスを再度一致させる必要がないように、パスと最大長をクエリの2番目の脚に入れます。あなたはWITH句でそれらを運ぶためにパスを収集し、あなたが戻ったときに、パスの長さにフィルタリングすることができます。

START n=node(*) 
MATCH p=n-[rels:INCLUDE*]->m 
WHERE ALL (rel IN rels 
    WHERE rel.status='on') 
WITH COLLECT(p) AS paths, MAX(length(p)) AS maxLength 
RETURN FILTER(path IN paths 
    WHERE length(path)= maxLength) AS longestPaths 
+0

などのように試してみてください。ありがとうございます。 – fereshteh

+0

と、どのようにパスの最後のノードを取得する必要がありますか? – fereshteh

関連する問題