如何在Cypher中使用一条语句创建所有边?

时间:2019-04-01 09:38:59

标签: neo4j cypher redisgraph

如何在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.nameEmployees之间创建所有边。我想在一个语句/查询中实现所有这些功能

简单地说,如果雇员,经理和地址之间存在匹配的顶点,我希望在它们之间创建所有边,但是如果只有任意两个之间存在匹配,我也希望在这两个顶点之间也创建边。我想在单个查询/语句中解决所有这些问题?

是否可以在一个满足上述所有条件的语句中编写查询?

到目前为止,我尝试过的是

首先使用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) 子句,这显然行不通,因为如果Wheree.name=m.name不会被选中,因此在员工和地址之间不会创建任何优势。

1 个答案:

答案 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))