如何在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
和{{1}之间创建所有边}与Address
类似,但Employees.zipcode != Address.zipcode
则我希望在Employees.name = Manager.name
和Employees
之间创建所有边。我想在一个语句/查询中实现所有这些功能
简单地说,如果雇员,经理和地址之间存在匹配的顶点,我希望在它们之间创建所有边,但是如果只有任意两个之间存在匹配,我也希望在这两个顶点之间也创建边。我想在单个查询/语句中解决所有这些问题?
是否可以在一个满足上述所有条件的语句中编写查询?
到目前为止,我尝试过的是
首先使用MATCH子句查找对,然后创建它们之间的关系。
Manager
由于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
不会被选中,因此在员工和地址之间不会创建任何优势。
答案 0 :(得分:1)
以下查询避免生成所有3个节点标签的cartesian product(并且如果:Manager(name)
和:Address(zipcode)
具有indexes,则性能会更好):
MATCH (e:Employees)
OPTIONAL MATCH (m:Manager)
WHERE e.name = m.name
WITH e, COLLECT(m) AS mList
FOREACH(x IN mList | CREATE (x)-[:REL_NAME]->(e))
WITH e
OPTIONAL MATCH (a:Address)
WHERE e.zipcode = a.zipcode
WITH e, COLLECT(a) AS aList
FOREACH(y IN aList | CREATE (e)-[:ADDR_REL]->(y))