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

Executing a transaction on neo4j it does not apply to the original graph

我有一张图表显示认识 (Conhece) 其他人的人 (Leitor)。所以我在密码控制台创建了一个这样的交易:

: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)这个人并不认识马修斯。为什么?

如果这是您用来创建图形的单个查询,那么问题是您没有 CREATE 语句来定义节点 Gutierrez 的属性。对于 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 充当 "get or create" 并将查找图中已有的与模式匹配的节点。如果符合 MERGE 语句中条件的节点已经存在,则变量将绑定到该节点。如果没有,那么将创建一个新节点。