0

如何在 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由于该子句,这显然不起作用,因为不会检查 if e.name=m.namethen e.zipcode = a.zipcode,因此不会在员工和地址之间创建边缘。

4

1 回答 1

1

以下查询避免产生所有 3 个节点标签的笛卡尔积(如果您有和的索引,性能会更好)::Manager(name):Address(zipcode)

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))
于 2019-04-01T19:50:21.853 回答