给定要搜索的顺序属性列表,我想查看图是否存在路径。列表的长度可以可变。
这是我最近的尝试:
WITH ['a', 'b', 'c', 'd'] AS search_list // can be any list of strings
// FOREACH (i IN range(search_list) |
// MATCH (a:Node {prop:i})-->(b:Node {prop:i+1}))
// RETURN true if all relationships exist, false if not
此解决方案无效,因为您不能在MATCH
中使用FOREACH
。我该怎么办?
答案 0 :(得分:1)
您可以尝试为匹配的整个路径手动构建查询,然后使用apoc.cypher.run
函数执行查询:
WITH ['a', 'b', 'c', 'd'] AS search_list
WITH search_list,
'MATCH path = ' +
REDUCE(c = '', i in range(0, size(search_list) - 2) |
c + '(:Node {prop: $props[' + i + ']})-->'
) +
'(:Node {prop: $props[' + (size(search_list) - 1) +']}) ' +
'RETURN count(path) as pathCount' AS cypherQuery
CALL apoc.cypher.run(cypherQuery, {props: search_list}) YIELD value
RETURN CASE WHEN value.pathCount > 0
THEN true
ELSE false
END AS pathExists
答案 1 :(得分:0)
假设您在$ props parameter中传递属性值的列表,并且该列表的长度为4
,则此查询将首先搜索长度为4且具有所需起始位置和末端节点(以缩小候选路径的范围),然后过滤路径的内部节点:
MATCH p=(a:Node {prop: $props[0]})-[*4]->(b:Node {prop: $props[-1]})
WITH p, NODES(p)[1..-2] AS midNodes
WHERE ALL(i IN RANGE(1, SIZE(midNodes)) WHERE midNodes[i-1] = $props[i])
RETURN p;
要提高效率,您还应该在:Node(prop)
上创建一个index。
如果此查询未返回任何内容,则说明没有匹配的路径。