当匹配创建节点 1-[关系]->节点 2 时,如果默认节点 2(结束节点)不存在,请设置它



如果我在做这样的事情:

OPTIONAL MATCH (start: {id: "1"})
OPTIONAL MATCH (end: {id: "2"})
CREATE start-[myRelationship:MyRelationshipType { title: "foobar" }]->end

如果"end"为空(即找不到),我想将 end 设置为默认节点。

我正在从 CSV 加载数据,因此这让我可以轻松识别由于缺少终端节点而无法形成的所有连接(csv 中的所有节点都是在上述之前创建的,我只是尝试设置关系)。

这有点昏昏欲睡,有什么想法吗?

@MagnusVortex和我正在考虑进行合并,但实际上我觉得我想要某种条件(如果结束为空{ end = MATCH {id:"my_default_node"})...类似的东西

[已编辑]

如果要创建从现有start节点到现有end节点(或者,如果后者不存在,则到默认节点)的(唯一)关系:

MATCH (start{ id: "1" }), (default {id:"my_default_node"})
OPTIONAL MATCH (end {id: "2"})
WITH start, CASE WHEN end IS NULL THEN [default] ELSE [end] END AS todo
FOREACH (x IN todo | CREATE UNIQUE (start)-[:MyRelationshipType { title: "foobar"}]->(x));

如果未找到startdeafult节点,则此查询不执行任何操作。此外,如果start节点已具有适当的关系,则此查询不会进行数据库更新。

原答案

如果要创建从现有start节点到end节点的(唯一)关系(如果该节点尚不存在,则创建该关系):

MATCH (start{ id: "1" })
CREATE UNIQUE (start)-[myRelationship:MyRelationshipType { title: "foobar" }]->(end {id: "2"});

如果未找到start节点,则此查询不执行任何操作。此外,如果start节点已具有匹配关系(与匹配的end节点),则此查询不会进行数据库更新。

性能较低的解决方案

作为兴趣点,以下查询产生相同的结果(但其配置文件显示执行起来要复杂得多,并且可能需要更多数据库命中):

MATCH (start { id: "1" })
MERGE (end { id: "2" })
MERGE (start)-[myRelationship:MyRelationshipType { title: "foobar" }]->(end);

最新更新