我不确定在这里做错了什么,所以这是我创建节点的方法
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)并显示它们之间的关系。我在这里做错了什么?
为了指导您最好的方法,让我们总结一些有关节点和关系创建的Neo4j基础知识:
一个节点可以具有一个或多个标签,标签的含义是按域(用户,发言人,公司等)对节点进行分组。例如,将标签作为表名查看。节点也可以具有属性。
关系只能是一种类型,关系正在组织图形。关系也可以具有属性。
要创建一个节点,可以使用CREATE
Writing子句:
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将懒惰地检查现有节点,将其视为MATCH OR CREATE子句:
MERGE (n:Person {firstname:'Fred'})
如果带有标签“ Person”和“ Fred”名字的节点不存在,则将创建该节点,否则将不会发生任何事情。这是@joslinm提到的方便的ON MATCH和ON CREATE。
如果在创建节点后多次运行此查询,则图形将不会更改,如果您知道http协议,则可以说MERGE是一个独立请求。
请注意,MERGE将通过创建一个完整的模式(如果尚不存在)来确保数据库中存在整个模式,这意味着如果您使用一个完整的模式进行MERGE,将查找整个模式的存在,而不是单个模式节点:
说一个标签为Person且名称属性值为'John'的节点已存在于数据库中:
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
克里斯
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句