我正在使用neo4j python模块neo4j-embedded来填充neo4j图。但是我无法弄清楚如何在两个节点之间建立独特的关系。
目前我每次创建一个新的关系,这绝对不是我们想要的。下面的代码显示了一个简单的例子,我只是创建9个节点,然后看看用“friendsWith”关系连接它们,但是目前这些关系并不是唯一的,我最终只有153个关系,但其中大约45个是多余的:
from neo4j import GraphDatabase
neo_db = GraphDatabase('../testdatabase/')
with neo_db.transaction:
person_idx = neo_db.node.indexes.create('people')
user_ids = [1,2,3,4,5,6,7,8,9]
for user in user_ids:
##########################################################################
## Check if user exists in neo4j,
## If not create it and save id, otherwise find the id.
##########################################################################
person_node = person_idx['name'][user].single
if person_node == None:
person_node = neo_db.node(name=user)
person_idx['name'][user] = person_node
for friend in user_ids:
##########################################################################
## Check if friend exists in neo4j,
## If not create it and save id, otherwise find the id.
##########################################################################
friend_node = person_idx['name'][friend].single
if friend_node == None:
friend_node = neo_db.node(name=friend)
person_idx['name'][friend] = friend_node
relationship = person_node.friendsWith(friend_node)
有没有办法检查使用上面提到的python模块在两个节点之间是否存在“friendsWith”类型的关系?或者只是创建关系的方式 其中一种类型尚不存在。
我正在寻找一种优选的解决方案,不需要使用cypher和查询命令查询数据库。
感谢您的帮助。
编辑:
我意识到你可以使用cypher获得如下解决方案,但是我正在寻找一种可以使用python完成的方法,理想情况下没有任何cypher的先验知识。部分原因是,我并不特别想要为我将广泛使用的功能编写一个即席查询,只是使用不同的节点和关系。
result = neo_db.query("START n = node:people(name='%i'),m=node:people(name='%i') MATCH (n)-[r:friendsWith]-(m) RETURN r;"%(user,friend))
if result.single == None:
relationship = person_node.friendsWith(friend_node)
答案 0 :(得分:1)
为什么不想使用密码?
如果你想避免重复,你必须:
否则,您必须遍历每个create上的所有rel,以检查当前要添加的目标节点是否已连接到当前源节点。