neo4j - Neo4J - 合并语句不创建具有关系的新节点
问题描述
我编写了一个查询,如果它存在则构建 2 个新节点,然后它只是更新属性并添加它们之间的关系。
当我第一次创建节点和关系时,一切都很顺利。
// This is the first run
MERGE (Kunal:PERSON)
ON CREATE SET
Kunal.name = 'Kunal',
Kunal.type = 'Person',
Kunal.created = timestamp()
ON MATCH SET
Kunal.lastUpdated = timestamp()
MERGE (Bangalore: LOC)
ON CREATE SET
Bangalore.name = 'Bangalore',
Bangalore.type = 'Location',
Bangalore.created = timestamp()
ON MATCH SET
Bangalore.lastUpdated = timestamp()
MERGE (Kunal)-[r1:LIVES_IN]->(Bangalore)
RETURN *
在这里,我添加了一个居住在(关系)班加罗尔(节点)的节点Kunal (节点)。第一次一切都很好。
下次我添加不同的节点时,如下所示:
// Next time
MERGE (John:PERSON)
ON CREATE SET
John.name = 'John',
John.type = 'Person',
John.created = timestamp()
ON MATCH SET
John.lastUpdated = timestamp()
MERGE (Bangalore: LOC)
ON CREATE SET
Bangalore.name = 'Bangalore',
Bangalore.type = 'Location',
Bangalore.created = timestamp()
ON MATCH SET
Bangalore.lastUpdated = timestamp()
MERGE (John)-[r1:LIVES_IN]->(Bangalore)
RETURN *
我正在添加一个住在(rel)班加罗尔(节点)的节点约翰。
但这里的问题是,它再次从之前的合并语句中获取相同的节点值。
有人可以解释一下吗?
如果我们说如果我们使用 Python 驱动程序在循环内运行上述合并查询,那么解决方案是什么。
解决方案
原因:
原因在于您的第一条和第二条MERGE
语句的匹配模式。因为它们只测试 and 的存在Label
Person
,Loc
而不是Person
带有名称的具体节点Kunal
。
主意:
正如@logisima 已经在此答案的评论中解释的那样:
“您应该始终在主键上使用 MERGE(带有索引/唯一约束)”。
解决方案:
{name: 'your content'}
您应该通过过滤类似或WHERE id(kunal)=1234
例如来匹配具体的唯一节点。
推荐阅读
- ansible - 努力使用 Ansible 切换到 root 用户
- c# - 为什么会触发带有事件消息“发生未处理的异常”的“事件代码 3005”?
- javascript - 让愚蠢的组件更聪明一点
- python - 更新/合并和更新熊猫列的子集
- r - 从R中的普通数据框创建权重节点和边列表?
- java - 绘制组件似乎导致光标和标签的鼠标侦听器不起作用
- java - 来自 Spring RestTemplate 的 IOException 未被自定义 ResponseErrorHandler 拾取
- javascript - 我如何存储照片的顺序?
- javascript - 如何防止 jquery 可调整大小的 div 接收调整大小的点击事件
- sql - 时间戳问题 - 不一致的行为 - PostgreSQL