在neo4j中建立关系

时间:2014-12-06 13:31:42

标签: neo4j

我不确定我在这里做错了什么,所以这就是我创建节点的方法

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,并显示它们之间的关系。我在这做错了什么?

2 个答案:

答案 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首先是"我创建了!"然后在匹配之后,它将是"我匹配!"