当 MATCHing to CREATE a node1-[relationship]->node2 设置默认的 node2(结束节点)(如果它不存在)

When MATCHing to CREATE a node1-[relationship]->node2 set a default node2 (end node) if it doesn't exist

如果我在做类似的事情:

OPTIONAL MATCH (start: {id: "1"})

OPTIONAL MATCH (end: {id: "2"})

CREATE start-[myRelationship:MyRelationshipType { title: "foobar" }]->end

如果 'end' 为 null(即未找到),我想将 end 设置为默认节点。

我正在从 CSV 加载数据,这样我就可以轻松识别由于缺少端节点而无法形成的所有连接(csvs 中的所有节点都是在上述之前创建的,其中我我只是想建立关系)。

有点傻,有什么想法吗?

@MagnusVortex 和我正在考虑进行 MERGE 但实际上我觉得我想要某种条件(如果 end IS NULL { 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);