Neo4J - 在现有节点上创建关系

7
我是新手,想要在现有节点和新节点之间创建一个新的关系。我有一个大学节点和一个人节点。我想把一个新的人分配给一个现有的大学。我正在尝试以下代码:MATCH (p:Person {name:'Nick'}), (u:University {title:'Exeter'}) CREATE (p)-[:LIKES]->(u)。所以上面的代码中: MATCH (p:Person {name:'Nick'}) 是新用户,(u:University {title:'Exeter'}) 是现有的大学。但它返回了 (no changes, no rows)。我甚至尝试了没有MATCH部分的查询,但也没有成功。我看了几个类似的答案,但它们也似乎不起作用。非常感谢任何帮助。谢谢。
3个回答

13

按照评论中的建议,先查找现有匹配项,再创建新项!

MATCH(u:University {title:'Exeter'})
CREATE(p:Person {name:'Nick'})
CREATE(p)-[w:LIKES]->(u)
return w

2
WITH在这里没有任何作用,你的查询是正确的,但更相关的是他应该使用CREATE而不是MATCH来首先创建用户节点,交换CREATE和MATCH,你就不需要WITH了,无论如何+1。 - Christophe Willemsen

3
你也可以使用MERGE语句如文档所述:
合并语句在匹配现有节点并绑定它们时,或者创建新数据并绑定它们时使用。它类似于MATCH和CREATE的组合,除此之外,还允许您指定如果数据已被匹配或创建后会发生什么。
你可以执行以下查询:
MERGE (p:Person {name:'Nick'})-[:LIKES]->(u:University {title:'Exeter'})

3
这仅在第一次运行时有效。对于其他人的后续运行,它将再次创建大学,因为MERGE会创建整个路径,除非整个路径已经存在。 - bikeman868

0

这是因为当你匹配时,你在数据库中搜索节点。当节点不存在时,数据库会说“我无法建立关系”。

幸运的是,有一种叫做合并的东西,它类似于匹配+创建,当他找不到整个路径时,他会创建它。应该像这样合并'node1'合并'node2'create(node1)[]->(node2)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接