【发布时间】:2019-04-01 09:38:59
【问题描述】:
如何在 Cypher 中使用一条语句创建所有边?
例如:假设我有一个这样的对象
Employees {name: "abc, country: "NZ", zipcode: "123456"}
Employees {name: "def", country: "AUS", zipcode: "964573"}
假设我有以下 Manager 对象
Manager { name: "abc", depatment: "product"}
Manager {name: "abc", depatment: "sales"}
Manager {name: "abc", depatment: "marketing"}
最后是地址对象
Address {zipcode: "964573", street: "Auckland St"}
现在我想创建Employees.name = Manager.name and Employees.zipcode = Address.zipcode 的所有边缘,但是如果Employees.name != Manager.name 但Employees.zipcode = Address.zipcode 然后我希望在Employees 和Address 之间创建所有边缘,类似地如果Employees.zipcode != Address.zipcode 但Employees.name = Manager.name然后我希望在Employees 和Manager 之间创建所有边缘。我想在一个语句/查询中实现所有这些
简单地说,如果员工、经理和地址之间存在匹配的顶点,我希望在它们之间创建所有边,但如果任何两个之间只有匹配,我希望在这两个顶点之间创建边。我想在一个查询/语句中完成所有这些?
这是否可以在一条语句中编写一个查询来满足上述所有条件?
到目前为止我尝试的是这个
首先使用 MATCH 子句查找对,然后在它们之间创建关系。
MATCH (e:Employees),(m:Manager), (a:Address)
WHERE e.name=m.name or e.zipcode = a.zipcode
WITH e,m,a
CREATE (m)-[:REL_NAME]->(e), (e)-[:ADDR_REL]->(a)
由于Where 子句,这显然不起作用,因为如果e.name=m.name 则e.zipcode = a.zipcode 不会被检查,因此不会在员工和地址之间创建边缘。
【问题讨论】:
-
你试过
MATCH (e:Employees),(m:Manager), (a:Address) WHERE e.name=m.name or e.zipcode = a.zipcode SET (m)-[:REL_NAME]->(e), (e)-[:ADDR_REL]->(a)吗? -
没有。你能解释一下这是如何工作的吗?所以我可以限制我的问题。
-
现在我看到了,你想要一个
match .. where name... set ... UNION match ... where zip ... set ...看起来你不能把match .. set ..和union混在一起。 -
我的想法更像
Optional match,虽然不确定完整的语法。 -
你能验证你最后的陈述吗?如果 WHERE 子句中的任何条件为真,我认为这个查询应该同时创建边 REL_NAME 和 ADDR_REL。
标签: neo4j cypher redisgraph