我正在使用python3.5和py2neo启动neo4j和我。
我用以下代码构建了两个图形节点。并成功创造。[!
>>> u1 = Node("Person",name='Tom',id=1)
>>> u2 = Node('Person', name='Jerry', id=2)
>>> graph.create(u1,u2)
之后,我会在汤姆和汤姆之间建立关系。和杰瑞'
Tom的id属性为1,Jerry的id属性为2。
因此。我想,我必须指向使用id属性的现有两个节点。 然后我尝试创建如下的关系。
>>> u1 = Node("Person",id=1)
>>> u2 = Node("Person",id=2)
>>> u1_knows_u2=Relationship(u1, 'KKNOWS', u2)
>>> graph.create(u1_knows_u2)
以上成功执行。但这个图表很奇怪。
我不知道为什么会创建未知的图节点。以及为什么在未知的两个节点之间建立关系。
答案 0 :(得分:4)
您可以拥有两个具有相同标签和相同属性的节点。使用u1 = Node("Person",id=1)
获得的第二个节点与之前创建的节点不同。它是具有相同标签/属性的新节点。
当您定义两个节点(即您的新u1
和u2
)并在它们之间创建关系时,将创建整个模式。
要获取两个节点并在它们之间创建关系,您可以这样做:
# create Tom and Jerry as before
u1 = Node("Person",name='Tom',id=1)
u2 = Node('Person', name='Jerry', id=2)
graph.create(u1,u2)
# either use u1 and u2 directly
u1_knows_u2 = Relationship(u1, 'KKNOWS', u2)
graph.create(u1_knows_u2)
# or find existing nodes and create a relationship between them
existing_u1 = graph.find_one('Person', property_key='id', property_value=1)
existing_u2 = graph.find_one('Person', property_key='id', property_value=2)
existing_u1_knows_u2 = Relationship(existing_u1, 'KKNOWS', existing_u2)
graph.create(existing_u1_knows_u2)
find_one()
假设您的id
属性是唯一的。
答案 1 :(得分:2)
另请注意,您可以将Cypher查询语言与Py2neo一起使用:
MERGE
Cypher中的Person
语句类似于" get或create"。如果tom
节点具有给定名称" Tom"已存在它将绑定到变量tom
,否则将创建节点然后绑定到for (var i in foo)
{
console.log(foo[i][0].user);
}
。这与添加uniqueness constraints相结合,可以避免不必要的重复节点。
答案 2 :(得分:2)
检查此查询,
MATCH (a),(b) WHERE id(a) =1 and id(b) = 2 create (a)-[r:KKNOWS]->(b) RETURN a, b