当MATCH创建一个node1- [relationship] - > node2时,如果它不存在,则设置一个默认的node2(end node)

时间:2016-03-03 17:41:50

标签: neo4j cypher graph-databases

如果我做的事情如下:

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

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

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

如果'结束'是null(即没有找到)我想结束一个默认节点。

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

有点想法,任何想法?

@MagnusVortex,我正在寻找MERGE,但我觉得我想要某种条件(如果结束IS NULL {end = MATCH {id:" my_default_node"})...像那样

1 个答案:

答案 0 :(得分:1)

[EDITED]

如果要创建从现有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);