检查节点是不是存在,如果不存在则创建

Posted

技术标签:

【中文标题】检查节点是不是存在,如果不存在则创建【英文标题】:Check whether a node exists, if not create检查节点是否存在,如果不存在则创建 【发布时间】:2014-07-23 19:54:23 【问题描述】:

我试图创建一个数据库,每当一个节点不存在时,它都会创建一个新节点并设置该节点与另一个节点之间的关系。如果节点存在,则两个节点都有关系。

我的问题是,如果我尝试连接 2 个现有节点,则会重新创建第二个节点。我尝试了 MERGE 和 CREATE UNIQUE,但都不起作用。

我的示例代码:

CREATE (test1 name:'1')
MATCH (n)
WHERE n.name = '1'
MERGE (n)-[:know r:'123']->(test3 name:'3')

MATCH (n)
WHERE n.name = '1'
MERGE (n)-[:know r:'123']->(test2 name:'2')

直到这里它才有效,但有:

MATCH (n)
WHERE n.name = '3'
MERGE (n)-[:know r:'123']->(test2 name:'2')

它会创建一个新节点“2”而不是连接到存在的节点。

【问题讨论】:

【参考方案1】:

当对完整模式使用 MERGE 时,行为是整个模式匹配,或者创建整个模式。 MERGE 不会部分使用现有模式 — 要么全有,要么全无。如果需要部分匹配,可以通过将模式拆分为多个 MERGE 子句来完成。 http://docs.neo4j.org/chunked/stable/query-merge.html

MERGE (n)-[:know r:'123']->(test2 name:'2') 将尝试匹配整个模式,因为它不存在,它会创建它。你可以做的是:

MERGE (n name: '3') //Create if a node with name='3' does not exist else match it
MERGE (test2 name:'2') //Create if a node with name='2' does not exist else match it
MERGE (n)-[:know r:'123']->(test2) //Create the relation between these nodes if it does not already exist

【讨论】:

您不必将 3 merge 用作 3 Cypher。您可以在 1 个密码(一行)中链接 3 个合并,以节省网络开销时间 @HahaTTpro 怎么做?你介意举个例子吗? 我认为他的意思是你可以在一行/命令中编写所有内容: MERGE (n name: '3') MERGE (test2 name:'2') MERGE ( n)-[:know r:'123']->(test2); 创建 tcp 数据包的方式(一行或三行)可能会或可能不会产生任何影响,并且不会比编写可读代码产生更大的影响,因此请使用您更熟悉的代码. (更不用说当您的数据库在桌面上运行时会产生零差异)

以上是关于检查节点是不是存在,如果不存在则创建的主要内容,如果未能解决你的问题,请参考以下文章

jQuery检查Cookie是不是存在,如果不存在则创建它

Shell 脚本检查 dir 目录是不是存在然后更改路径,如果不存在则使用该名称创建 dir 并检查文件名不存在

从 Excel VBA-检查访问表是不是存在/如果不存在,则创建/复制

SQLITE检查表users是不是存在的sql语句,如果不存在则创建表users

检查列表中的对象是不是存在,如果在 R 中不存在则将其删除

检查行是不是已存在如果不存在则插入行否则显示消息