2017-12-20 16 views
0

Neo4jデータベース内の特定のノードから発信され終了するすべてのループを探したい。私は試しました:Neo4j Cypherは特定のノードからループを見つける

START n=node:Event(time=",timestamp,") 
MATCH p=(n)-[:LINKED_TO*1..5]->(n) 
WHERE NONE (n IN nodes(p) WHERE size(filter(x IN nodes(p) WHERE n = x))> 2) 
RETURN p, length(p) 

これは私がウェブ上のものからマッシュアップできる最高です。 1.これはクラッシュする 2.開始+終了ノードを許可するには、カウントしきい値が "> 2"でなければなりません。これは、同じ中間ノードを2回訪れるループが含まれることを意味します。私はそうではないことを望みます。

私は最短経路に興味がありません。開始ノードに戻るすべてのループを知りたい。

ありがとうございます!

答えて

1

このクエリでは、起動して、指定されたノードで終了し、他の繰り返しノードを持たないすべてのループを返す必要があります:

START n=node:Event(time=",timestamp,") 
MATCH p=(n)-[:LINKED_TO*1..5]->(n) 
UNWIND TAIL(NODES(p)) AS m 
WITH p, COUNT(DISTINCT m) AS cm 
WHERE LENGTH(p)-1 = cm 
RETURN p, LENGTH(p); 
+0

これは私が最終的に私のために働いて見つけたものです: –

0

は、cybersamをありがとう!それは役に立ちました。タイプされると、いくつかのエラーが発生し、「START」は推奨されなくなりました。私は、以下の変更が働いた:

MATCH (n:Event{time:1458238060505007}) 
MATCH p=(n)-[:LINKED_TO*1..5]->(n) 
UNWIND TAIL(NODES(p)) AS m WITH p RETURN p 

これの唯一の問題は、n、に所望の開始ノードを経由するすべてののパスを与えるように見えるということです。本当?もしそうなら、これを修正する方法はありますか?

+0

これは答えではありません。私の答えにコメントするか、あなたの質問に編集に含まれているか、新しい質問をしてください。ところで、この新しいCypherクエリは、あなたが望むと言ったことをしません。新しい質問がありますか? – cybersam

0

これは最終的に私のために働いた。サイバーサムの提案に非常に近いです。これを「間違ったやり方」とする​​ことに対する謝罪。私はcybersamが私に叫ぶだろうと確信していますが、コメントを介してコードを追加することは非常に読みにくいです。

MATCH p=(n:Event{time:",timestamp,"})-[:LINKED_TO*1..5]->(n) 
UNWIND TAIL (NODES(p)) AS m 
WITH p,COUNT(DISTINCT m) AS cm 
WHERE LENGTH(p) = cm 
RETURN p 

Iは前述のように、一個の付着点が非推奨と(私が使用しているRにRNeo4jを使用する場合など)エラーが発生している「START」の使用でした。新しい方法は、MATCHを使用して、パスパターンに開始ノードを指定することです。私のもう一つの混乱は、「長さ(p)」の代わりに「長さ(p)-1」を使用したことでした。あるノードが別のノードに接続する場合、パスの長さは3ではなく2であり、2つの異なるノードしか存在しません。私のアプリケーションでは、 "LENGTH(p)= cm"が働いていました。

最後に、パス内のノードを使用する場合は、「WITH m、...」を使用しないでください。なぜなら、何らかの理由でこれが "COUNT(DISTINCT(m))"計算を駄目にするからです。わかる。

関連する問題