在同一 Cypher 查询中具有多个匹配项的问题
Questions with multiple matches in the same Cypher query
假设我有下图
CREATE
(n1:Person {name: "David Wallace", role: "CFO", dept: "management"}),
(n2:Person {name: "Ryan Howard", role: "VP, North East Region", dept: "management"}),
(n3:Person {name: "Toby Flenderson", role: "HR Rep.", dept: "HR"}),
(n4:Person {name: "Michael Scott", role: "Regional Manager", dept: "management"}),
(n5:Person {name: "Todd Pecker", role: "Travel Sales Rep.", dept: "Sales"}),
(n6:Person {name: "Angela Martin", role: "Senior Accountant", dept: ["Accounting", "Party Planning Committee"]}),
(n7:Person {name: "Dwight Schrute", role: ["Sales", "Assistant to the Regional Manager"], dept: "Sales"}),
(n8:Person {name: "Jim Halpert", role: ["Sales", "Assistant Regional Manager"], dept: "Sales"}),
(n9:Person {name: "Pam Beesley", role: "Receptionist", dept: "Reception"}),
(n10:Person {name: "Creed Barton", role: "Quality Assurance Rep.", dept: "Quality Control"}),
(n11:Person {name: "Darryl Philbin", role: "Warehouse Foreman", dept: "Warehouse"}),
(n12:Person {name: "Kevin Malone", role: "Accountant", dept: "Accounting"}),
(n13:Person {name: "Oscar Martinez", role: "Accountant", dept: "Accounting"}),
(n14:Person {name: "Meredith Palmer", role: "Supplier Relations", dept: "Supplier Relations"}),
(n15:Person {name: "Kelly Kapoor", role: "Customer Service Rep.", dept: "Customer Service"}),
(n16:Person {name: "Jerry DiCanio", dept: "Warehouse"}),
(n17:Person {name: "Madge Madsen", dept: "Warehouse"}),
(n18:Person {name: "Lonnie Collins", dept: "Warehouse"}),
(n19:Person {name: "Andy Bernard", role: "Regional Director in Sales", dept: "Sales"}),
(n20:Person {name: "Phyllis Lapin", role: "Sales", dept: "Sales"}),
(n21:Person {name: "Stanley Hudson", role: "Sales", dept: "Sales"}),
(n1)-[:manages]->(n2),
(n2)-[:manages]->(n3),
(n2)-[:manages]->(n4),
(n2)-[:manages]->(n5),
(n4)-[:manages]->(n6),
(n4)-[:manages]->(n7),
(n4)-[:manages]->(n8),
(n4)-[:manages]->(n9),
(n4)-[:manages]->(n10),
(n4)-[:manages]->(n11),
(n4)-[:manages]->(n14),
(n4)-[:manages]->(n15),
(n6)-[:manages]->(n12),
(n6)-[:manages]->(n13),
(n8)-[:manages]->(n19),
(n11)-[:manages]->(n16),
(n11)-[:manages]->(n17),
(n11)-[:manages]->(n18),
(n19)-[:manages]->(n20),
(n19)-[:manages]->(n21);
我有以下查询
Does Michael directly manage more employees than Jim Halpert?
我提出了以下 Cypher 查询
MATCH (p:Person)<-[:manages]-(n:Person)
WHERE n.name = "Michael Scott"
MATCH (q:Person)<-[:manages]-(m:Person)
WHERE m.name = "Jim Halpert"
RETURN count(p) > count(q)
查询returnsfalse
。我检查了 count(p)
和 count(q)
都是 8。我想知道这是为什么?此外,MATCH
语句的范围意味着 p
和 q
绑定到不同的变量(即变量仅在 MATCH 语句范围内可见;我可以重复使用相同的变量对于不同的 MATCH 语句)?
谢谢!
链接更多 MATCH
子句时的一个好方法是使用 WITH
显式分隔查询部分的语句,允许您声明将哪些变量传递到下一部分。
你的情况:
MATCH (p:Person)<-[:manages]-(n:Person)
WHERE n.name = "Michael Scott"
WITH count(p) AS countP
MATCH (q:Person)<-[:manages]-(m:Person)
WHERE m.name = "Jim Halpert"
RETURN countP > count(q)
您查询中的两个匹配项形成一个卡特氏积,每个 q (1 x 8) 返回一个 p。如果用 Darryl Philbin 代替 Jim Halpert,每个 p 和 q (3 x 8).
如果你 运行:
你会更清楚地看到发生了什么
MATCH (p:Person)<-[:manages]-(n:Person)
WHERE n.name = "Michael Scott"
MATCH (q:Person)<-[:manages]-(m:Person)
WHERE m.name = "Jim Halpert"
RETURN p.name, q.name
正如 Lukasmp3 所说,引入 WITH 将查询分成两个不同的部分并阻止 catresian 产品形成,然后您将得到预期的答案。
假设我有下图
CREATE
(n1:Person {name: "David Wallace", role: "CFO", dept: "management"}),
(n2:Person {name: "Ryan Howard", role: "VP, North East Region", dept: "management"}),
(n3:Person {name: "Toby Flenderson", role: "HR Rep.", dept: "HR"}),
(n4:Person {name: "Michael Scott", role: "Regional Manager", dept: "management"}),
(n5:Person {name: "Todd Pecker", role: "Travel Sales Rep.", dept: "Sales"}),
(n6:Person {name: "Angela Martin", role: "Senior Accountant", dept: ["Accounting", "Party Planning Committee"]}),
(n7:Person {name: "Dwight Schrute", role: ["Sales", "Assistant to the Regional Manager"], dept: "Sales"}),
(n8:Person {name: "Jim Halpert", role: ["Sales", "Assistant Regional Manager"], dept: "Sales"}),
(n9:Person {name: "Pam Beesley", role: "Receptionist", dept: "Reception"}),
(n10:Person {name: "Creed Barton", role: "Quality Assurance Rep.", dept: "Quality Control"}),
(n11:Person {name: "Darryl Philbin", role: "Warehouse Foreman", dept: "Warehouse"}),
(n12:Person {name: "Kevin Malone", role: "Accountant", dept: "Accounting"}),
(n13:Person {name: "Oscar Martinez", role: "Accountant", dept: "Accounting"}),
(n14:Person {name: "Meredith Palmer", role: "Supplier Relations", dept: "Supplier Relations"}),
(n15:Person {name: "Kelly Kapoor", role: "Customer Service Rep.", dept: "Customer Service"}),
(n16:Person {name: "Jerry DiCanio", dept: "Warehouse"}),
(n17:Person {name: "Madge Madsen", dept: "Warehouse"}),
(n18:Person {name: "Lonnie Collins", dept: "Warehouse"}),
(n19:Person {name: "Andy Bernard", role: "Regional Director in Sales", dept: "Sales"}),
(n20:Person {name: "Phyllis Lapin", role: "Sales", dept: "Sales"}),
(n21:Person {name: "Stanley Hudson", role: "Sales", dept: "Sales"}),
(n1)-[:manages]->(n2),
(n2)-[:manages]->(n3),
(n2)-[:manages]->(n4),
(n2)-[:manages]->(n5),
(n4)-[:manages]->(n6),
(n4)-[:manages]->(n7),
(n4)-[:manages]->(n8),
(n4)-[:manages]->(n9),
(n4)-[:manages]->(n10),
(n4)-[:manages]->(n11),
(n4)-[:manages]->(n14),
(n4)-[:manages]->(n15),
(n6)-[:manages]->(n12),
(n6)-[:manages]->(n13),
(n8)-[:manages]->(n19),
(n11)-[:manages]->(n16),
(n11)-[:manages]->(n17),
(n11)-[:manages]->(n18),
(n19)-[:manages]->(n20),
(n19)-[:manages]->(n21);
我有以下查询
Does Michael directly manage more employees than Jim Halpert?
我提出了以下 Cypher 查询
MATCH (p:Person)<-[:manages]-(n:Person)
WHERE n.name = "Michael Scott"
MATCH (q:Person)<-[:manages]-(m:Person)
WHERE m.name = "Jim Halpert"
RETURN count(p) > count(q)
查询returnsfalse
。我检查了 count(p)
和 count(q)
都是 8。我想知道这是为什么?此外,MATCH
语句的范围意味着 p
和 q
绑定到不同的变量(即变量仅在 MATCH 语句范围内可见;我可以重复使用相同的变量对于不同的 MATCH 语句)?
谢谢!
链接更多 MATCH
子句时的一个好方法是使用 WITH
显式分隔查询部分的语句,允许您声明将哪些变量传递到下一部分。
你的情况:
MATCH (p:Person)<-[:manages]-(n:Person)
WHERE n.name = "Michael Scott"
WITH count(p) AS countP
MATCH (q:Person)<-[:manages]-(m:Person)
WHERE m.name = "Jim Halpert"
RETURN countP > count(q)
您查询中的两个匹配项形成一个卡特氏积,每个 q (1 x 8) 返回一个 p。如果用 Darryl Philbin 代替 Jim Halpert,每个 p 和 q (3 x 8).
如果你 运行:
你会更清楚地看到发生了什么MATCH (p:Person)<-[:manages]-(n:Person)
WHERE n.name = "Michael Scott"
MATCH (q:Person)<-[:manages]-(m:Person)
WHERE m.name = "Jim Halpert"
RETURN p.name, q.name
正如 Lukasmp3 所说,引入 WITH 将查询分成两个不同的部分并阻止 catresian 产品形成,然后您将得到预期的答案。