我正在尝试使用py2noe使用一些节点和关系创建图形。比如说,我正在创建一个家谱。
我正在使用get_or_create()
创建节点,这样如果我再次提供相同的值,我的脚本就不会创建重复项。
我如何为关系做同样的事情?我无法找到关于get_or_create()
类似函数的任何引用。
我想发布(Joe)-[:son]->(John)
它第一次创建2个节点joe和john以及它们之间的链接。
如果我重新运行我的脚本,因为节点是唯一的,它们不会被发布但是会创建一个新的关系。
这给了我一个包含2个节点和n个关系的图表,其中n是我运行脚本的次数。
我也尝试过使用cypher,我也遇到了同样的问题。它不断创造关系。
有谁能建议我解决这个问题的方法?
感谢。
答案 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)")