给定父节点创建节点和关系

时间:2015-12-12 14:19:23

标签: neo4j py2neo

我正在创建一个单词树但是当我执行这个密码查询时:

word = "MATCH {} MERGE {}-[:contains]->(w:WORD {{name:'{}'}}) RETURN w"
    .format(parent_node, parent_node, locality[i])

其中parent_node的类型为Node

它抛出了这个错误:

py2neo.cypher.error.statement.InvalidSyntax: Can't create `n8823` with properties or labels here. It already exists in this context

格式化查询如下所示:

'MATCH (n8823:HEAD {name:"sanjay"}) MERGE (n8823:HEAD {name:"sanjay"})-[:contains]->(w:WORD {name:\'colony\'}) RETURN w'

2 个答案:

答案 0 :(得分:1)

格式化的查询已被破坏,无法使用,但我也看不出格式化查询的实际情况。当你执行字符串格式时,你传递相同的参数(parent_node)两次,所以最后的字符串应该重复该参数的样子。它没有,而是有两种不同的匹配和合并子句模式。

您的查询应该类似于

MATCH (n8823:Head {name: "sanjay"})
MERGE (n8823)-[:CONTAINS]->(w:Word {name: "colony"})
RETURN w

Node对象上进行字符串格式化可能是个坏主意。最好 使用Cypher查询中的节点对象的属性值来匹配正确的节点(并且只有在匹配子句中绑定匹配节点的变量)使用节点对象的方法进行合并。

答案 1 :(得分:0)

虽然MERGE子句能够绑定标识符(例如n8823),但遗憾的是,Cypher不允许MERGE 重新绑定一个标识符已被束缚 - 即使它实际上不会改变绑定。 (另一方面,MATCH子句 允许"重新绑定"到同一个绑定。)只需重新使用绑定标识符但是没关系。

因此,解决方法是更改​​Cypher查询以重新使用绑定标识符。此外,在不更改查询的整体结构的情况下动态指定查询数据的推荐方法是使用"查询参数"。对于py2neo,沿着这些行的代码应该对你有用(注意parent_name变量将包含一个名称字符串,如" sanjay"):

from py2neo import Graph
graph = Graph()
cypher = graph.cypher
results = cypher.execute(
  "MATCH (foo:{name:{a}}) MERGE (foo)-[:contains]->(w:WORD {{name:'{b}'}}) RETURN w",
  a=parent_name, b=locality[i])