在neo4j上执行一个事务它不适用于原始图

时间:2016-01-09 21:42:36

标签: transactions neo4j

我有一张图表显示知道(Conhece)其他人的人(Leitor)。所以我在cypher控制台上创建了一个trasaction,如下所示:

:POST /db/data/transaction/commit
{
  "statements" : [ {
    "statement" : "CREATE (Matheus:Leitor {nome:'Matheus', completo:'Matheus Silva'}) CREATE (Gutierrez)-[:Conhece]->(Matheus) CREATE (Matheus)-[:Conhece]->(Gutierrez) CREATE (Jose:Leitor {nome:'Jose', completo:'Jose Silva'}) CREATE (Jose)-[:Conhece]->(Matheus) CREATE (Matheus)-[:Conhece]->(Jose) RETURN Matheus"
  } ]
}

但最终结果这个人(Leitor)Gutierrez不认识Matheus。为什么呢?

enter image description here

1 个答案:

答案 0 :(得分:2)

如果这是您用于创建图表的单个查询,那么问题是您没有CREATE语句定义Node Gutierrez的属性。对于古铁雷斯,只有CREATE (Gutierrez)-[:Conhece]->(Matheus)CREATE (Matheus)-[:Conhece]->(Gutierrez),指的是一个名为" Gutierrez"的变量。由于没有任何内容绑定到此变量,因此第一次使用它时将在图形中创建一个空白节点,并将该空白节点绑定到变量" Gutierrez"。

你有几种方法可以解决这个问题。一种是在查询开头为Gutierrez简单添加CREATE语句:

CREATE (Gutierrez:Leitor {nome:'Gutierrez', completo: 'Full Name Here'})
...

这将创建具有上面定义的属性的节点,并将该节点绑定到变量" Gutierrez"对于其余的查询。

如果图表中可能已存在数据,但您可能希望使用MERGEstatement代替CREATE

MERGE (Gutierrez:Leitor {nome:'Gutierrez'})
ON CREATE SET Gitierrez.completo = 'Full Name Here'
MERGE (Matheus:Leitor {nome:'Matheus'})
ON CREATE SET Matheus.completo = 'Matheus Silva'
...

MERGE充当"获取或创建"并将在匹配模式的图形中查找已经存在的节点。如果符合MERGE语句中的条件的节点已存在,则该变量将绑定到该节点。如果没有,那么将创建一个新节点。