15

次のようなクエリがあるとします。

START n = node(123)
MATCH p = n-[r:LIKES*..3]->x
RETURN p;

上記のクエリで取得した結果パスには、サイクルが含まれています。

単純なパスのみを返すにはどうすればよいですか?

この例を考えると:

  • [Neo、Morpheus、Trinity、Morpheus、Neo]のようなノードが繰り返されるパスを回避するにはどうすればよいですか。
4

3 に答える 3

16

パスの一意性を指定することは、サイファーの計画された機能です。

したがって、現時点では、パス内で重複しているノードがないことを確認する必要があります。

ALLコレクションのすべての要素(パス)に当てはまる必要がある述語があります。そしてfilter、特定の条件が当てはまるコレクションの要素を抽出できます。

START neo=node(1) 
MATCH path= neo-[r:KNOWS*..4]->other 
WHERE ALL(n in nodes(path) where 
          1=length(filter(m in nodes(path) : m=n))) 
RETURN neo, LENGTH(path) AS length, EXTRACT(p in NODES(path) : p.name), other 
ORDER BY length

だから私がしたことは:

  • パスのすべてのノードn
  • 等しいノードのパスをフィルタリングしますn
  • lengthそのコレクションのを決定する
  • ALLそれぞれに1つでなければならないことを主張するn

参照:http ://console.neo4j.org/r/dpalbl

于 2012-12-19T09:15:38.823 に答える
3

これに対する私の回避策:

START n = node(123), x=node(*)
MATCH p = shortestPath(n-[r:LIKES*..3]->x)
RETURN p;

コンソールの例を参照してください

于 2012-12-14T13:09:22.983 に答える
2

2.3.0では、以下を使用します。

MATCH path = (start {id:2})<-[*1..]-(end {id:3}) 
WHERE ALL(n in nodes(path) where 
          1 = size(filter(m in nodes(path) where m=n))) 
RETURN start, LENGTH(path) AS length, EXTRACT(p in NODES(path) | p.id), end
ORDER BY length
于 2015-11-03T01:44:42.467 に答える