匹配多个独立(或依赖)路径

Matching multiple independent (or dependent) paths

我正在查看人员和组织的层次结构,并试图找到 where/if 他们会面并分享管理。假设 "Bob" 和 "Susan" 适用于不同的分支。我想展示他们在整个公司的两个报告关系 if/when 他们重叠。

此查询目前运行良好,returns 单一路径:

MATCH path=(p:Person {name: "Bob"})-[:reports_to*]->(o:Organization {code: "TopOfCompany"})
RETURN path;

此查询也很有效,returns 单个路径:

MATCH path2=(p:Person {name: "Susan"})-[:reports_to*]->(o2:Organization {code: "TopOfCompany"})
RETURN path2;

这个查询(在一个操作中同时完成)returns什么都没有:

MATCH path=(p:Person {name: "Bob"})-[:reports_to*]->(o:Organization {code: "TopOfCompany"}),
      path2=(p:Person {name: "Susan"})-[:reports_to*]->(o2:Organization {code: "TopOfCompany"})
RETURN path,path2;

如果我在第二个路径查询中重用第一个 o 绑定,情况也是如此。

我知道我可以重新表述它以找到两个人在中间相遇的地方,如下所示:

MATCH path=(p1:Person {name: "Bob"})-[:reports_to*]->(o:Organization)<-[:reports_to*]-(p2:Person {name: "Susan"})
RETURN path;

确实该查询运行良好 - 但如果它们在中间不相遇,则该查询将失败,因为中间的 o:Organization 不存在。

可能还有其他等效的方法我可以重新制定以获得正确的结果 - 但我的问题的核心是,是否不可能在一个查询中识别两个不同的独立路径? 这在它们不符合的情况下很有用,我匹配的目标 ("TopOfCompany") 不同,或者我只是想比较一系列路径。

哦,我在 2.2M04,正在使用服务器。两条路径查询成功,但是结果为空,如JSON版本的结果是:

{"columns":["path","path2"],"data":[],"stats":{"contains_updates":false,"nodes_created":0,"nodes_deleted":0,"properties_set":0,"relationships_created":0,"relationship_deleted":0,"labels_added":0,"labels_removed":0,"indexes_added":0,"indexes_removed":0,"constraints_added":0,"constraints_removed":0}}

Optional Match,可以被认为是 SQL 中外连接的 Cypher 等价物,可以在路径匹配时使用。以下查询匹配两个单独的路径以及匹配两个人的路径:

MATCH 
    path1=(p1:Person {name: "Bob"})-[:reports_to*]->(o1:Organization {code: "TopOfCompany"})
OPTIONAL MATCH
    path2=(p2:Person {name: "Susan"})-[:reports_to*]->(o2:Organization {code: "TopOfCompany"})
OPTIONAL MATCH
    path3=(p1)-[:reports_to*]->(o:Organization {code: "TopOfCompany"})<-[:reports_to*]-(p2)
RETURN path1, path2, path3;

您的这个查询对 BobSusan 节点使用相同的变量 (p),这可能解释了为什么它不能按您预期的那样工作(单个同一节点不能有 2 个不同的值 属性):

MATCH path=(p:Person {name: "Bob"})-[:reports_to*]->(o:Organization {code: "TopOfCompany"}),
      path2=(p:Person {name: "Susan"})-[:reports_to*]->(o2:Organization {code: "TopOfCompany"})
RETURN path,path2;

您可以使用不同的变量,或者完全摆脱节点变量(因为您不会在任何地方使用它们)——像这样:

MATCH path=(:Person {name: "Bob"})-[:reports_to*]->(:Organization {code: "TopOfCompany"}),
      path2=(:Person {name: "Susan"})-[:reports_to*]->(:Organization {code: "TopOfCompany"})
RETURN path,path2;