Neo4j-检查是否存在顺序路径

时间:2019-02-04 18:54:21

标签: neo4j cypher

给定要搜索的顺序属性列表,我想查看图是否存在路径。列表的长度可以可变。

这是我最近的尝试:

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。我该怎么办?

2 个答案:

答案 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

如果此查询未返回任何内容,则说明没有匹配的路径。