使用py2neo get_or_create在Neo4j中创建唯一关系

时间:2014-09-09 22:48:05

标签: neo4j cypher py2neo

我正在尝试使用py2noe使用一些节点和关系创建图形。比如说,我正在创建一个家谱。

我正在使用get_or_create()创建节点,这样如果我再次提供相同的值,我的脚本就不会创建重复项。

我如何为关系做同样的事情?我无法找到关于get_or_create()类似函数的任何引用。

我想发布(Joe)-[:son]->(John) 它第一次创建2个节点joe和john以及它们之间的链接。 如果我重新运行我的脚本,因为节点是唯一的,它们不会被发布但是会创建一个新的关系。

这给了我一个包含2个节点和n个关系的图表,其中n是我运行脚本的次数。

我也尝试过使用cypher,我也遇到了同样的问题。它不断创造关系。

有谁能建议我解决这个问题的方法?

感谢。

1 个答案:

答案 0 :(得分:0)

我不知道py2neo(所以可能有这个函数的包装器),但实现这个的方法是使用Cypher MERGE,看起来你必须使用原始Cypher语句运行:

cypher_merge_result = neo4j.CypherQuery(graph_db, 
"MERGE (s:Person{name:Joe})-[:SON]->(f:Person{name:John})")

这将创建2个Person节点和1个SON关系,无论您运行多少次。

Neo4J文档是here,了解它是如何工作的很重要,因为MERGE语句中的部分匹配将导致创建整个模式。因此,如果您的Person节点已经存在,则应提前匹配它们以避免重复创建Person。即

cypher_merge_result = neo4j.CypherQuery(graph_db, 
"MATCH (s:Person{name:Joe}), (f:Person{name:John}) MERGE (s)-[:SON]->(f)")