我不确定我在这里做错了什么,所以这就是我创建节点的方法
CREATE (urlnode_1:UrlNode {url:'url1', nodenumber:1})
CREATE (urlnode_2:UrlNode {url:'url2', nodenumber:2})
我按如下方式创建关系
CREATE
(urlnode_1)-[:OutLink {anchor_text:['MY']}]->(urlnode_2)
首先成功创建了两个节点,现在运行代码来创建关系,我希望两个创建的节点之间存在关系,但它会创建两个新节点,例如3和4,并显示它们之间的关系。我在这做错了什么?
答案 0 :(得分:3)
为了指导您的最佳方式,让我们总结一些关于节点和关系创建的Neo4j基础知识:
节点可以有一个或多个标签,标签用于按域分组节点(用户,扬声器,公司等等。例如,将标签视为表名称)。节点也可以具有属性。
一个关系只能有一种类型,关系正在组织图形。关系也可以有属性。
要创建节点,您可以使用CREATE
写条款:
CREATE (n:Person {firstname: 'John'})
CREATE语句不会检查是否已存在具有相同标签和属性的其他节点,它只会创建一个新节点
也可以使用相同的子句创建关系:
MATCH (n:Person {firstname: 'John'}), (p:Person {firstname: 'Pierre'})
CREATE (n)-[:KNOWS]->(p)
也可以一次创建完整的模式:
CREATE (n:Person {name:'Chris'})-[:KNOWS]->(p:Person {name:'Oliver'})
提醒:CREATE不会检查现有节点。
---现在 MERGE ---
MERGE将懒洋洋地检查现有节点,将其视为 MATCH OR CREATE 子句:
MERGE (n:Person {firstname:'Fred'})
如果标签为Person和firstname Fred的节点不存在,则将创建该节点,否则不会发生任何事情。这就是@joslinm提到的方便的ON MATCH和ON CREATE。
如果在创建节点后多次运行此查询,则图表不会更改,如果您知道http协议,则可以说MERGE是一个无效请求。
请注意,MERGE将确保数据库中存在整个模式,如果它尚不存在则创建它,这意味着如果您使用完整模式进行MERGE,则将查找整个模式是否存在,不是一个节点:
说一个带有标签Person和name属性的节点,其值为' John'已存在于db:
中MERGE (n:Person {name:'John'})
不会影响图表
但是:
MERGE (n:Person {name:'John'})-[:KNOWS]->(:Person {name:'Nathalia'})
将创建一个新的John节点,因为整个模式不存在。
建议逐步使用MERGE:
MERGE (n:Person {name:'John'})
MERGE (p:Person {name:'Nathalia'})
MERGE (n)-[:KNOWS]->(p)
如果您想了解更多有关MERGE条款的信息,我强烈建议您阅读Luanne关于GraphAware的精彩文章:http://graphaware.com/neo4j/2014/07/31/cypher-merge-explained.html
克里斯
答案 1 :(得分:2)
如果您创建了一个关系,则每次都会创建一个新关系。它们本身并不是唯一的。听起来你宁愿合并这种关系;即,如果他们的关系在那里,匹配它,如果没有,创建它。
它的合并语法如下:
MERGE (a:Node)-[:LIKES]->(b:Node)
ON
MATCH SET a.msg = 'I matched!'
ON
CREATE SET a.msg = 'I created!'
RETURN a
您可以在此处试用:http://console.neo4j.org/
您会注意到msg
首先是"我创建了!"然后在匹配之后,它将是"我匹配!"