在OPTIONAL MATCH之后创建没有找到匹配项

时间:2014-04-24 16:07:32

标签: neo4j cypher

我正在尝试编写一个查询,如果已存在其他关系,则会创建一些关系。

START a=node(1), b=node(2), c=node(3)
OPTIONAL MATCH a-[r1:RELATIONSHIP]-(optional1)
OPTIONAL MATCH b-[r2:RELATIONSHIP]-(optional2)
CREATE c-[:NEW_RELATIONSHIP]->(optional1)
CREATE c-[:NEW_RELATIONSHIP]->(optional2)
DELETE r1, r2
RETURN a, b, c

查询返回错误:

“预期optional1到节点,但它是空”

如果存在现有关系,是否有办法创建新关系?否则只需忽略create?

1 个答案:

答案 0 :(得分:9)

目前,您可以使用FOREACHCASE解决此问题。例如:

START a=node(1), b=node(2), c=node(3)
OPTIONAL MATCH (a)-[r1:RELATIONSHIP]-(optional1)
OPTIONAL MATCH (b)-[r2:RELATIONSHIP]-(optional2)
FOREACH (o IN CASE WHEN optional1 IS NOT NULL THEN [optional1] ELSE [] END |
  CREATE (c)-[:NEW_RELATIONSHIP]->(optional1)
)
FOREACH (o IN CASE WHEN optional2 IS NOT NULL THEN [optional2] ELSE [] END |
  CREATE (c)-[:NEW_RELATIONSHIP]->(optional2)
)
DELETE r1, r2
RETURN a, b, c

我怀疑将来Cypher语言更新会更简单。

PS。你可能不应该再使用START,但我想你只是为了方便一个例子。