次のようなクエリがあるとします。
START n = node(123)
MATCH p = n-[r:LIKES*..3]->x
RETURN p;
上記のクエリで取得した結果パスには、サイクルが含まれています。
単純なパスのみを返すにはどうすればよいですか?
この例を考えると:
- [Neo、Morpheus、Trinity、Morpheus、Neo]のようなノードが繰り返されるパスを回避するにはどうすればよいですか。
パスの一意性を指定することは、サイファーの計画された機能です。
したがって、現時点では、パス内で重複しているノードがないことを確認する必要があります。
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
これに対する私の回避策:
START n = node(123), x=node(*)
MATCH p = shortestPath(n-[r:LIKES*..3]->x)
RETURN p;
コンソールの例を参照してください
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