匹配多个独立(或依赖)路径
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;
您的这个查询对 Bob
和 Susan
节点使用相同的变量 (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;
我正在查看人员和组织的层次结构,并试图找到 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;
您的这个查询对 Bob
和 Susan
节点使用相同的变量 (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;