我正在努力更新使用 Neo4JClient v3.x 的代码以与最新的 Neo4J 服务器和 Neo4jClient v5.x 配合使用。
我的查询基本上会创建 2 个节点以及它们之间的关系。 如果任何节点或两个节点都不存在,则会沿着关系创建它们
旧工作查询:
query1 = client.Cypher
.Match("(e1:Entity)", "(e2:Entity)")
.Where("e1.Id={id1} and e2.Id={id2}")
.WithParam("id1", id1)
.WithParam("id2", id2)
.WithParam("line", line)
.Merge("(e1)-[r:REF {LINE:{line}}]->(e2)");
以上代码在新版本的Neo4j服务器/Neo4jClient中不起作用 我尝试修改它当前创建重复节点而不是唯一节点
query1 = client.Cypher
.Create("(e1:Entity $id1)")
.Create("(e2:Entity $id2)")
.WithParam("id1",new { Id = id1 })
.WithParam("id2", new { Id = id2 })
.WithParam("line", line)
.Create("(e1)-[r:REF {LINE:$line}\]->(e2)");
你能帮我将上面的第一个查询转换为在新版本中工作吗?
您的第一个查询在开头执行
MATCH
,这永远不会有 CREATE
d e1
或 e2
- 您需要使用 MERGE
来实现您所追求的目标。
此查询:
query1 = client.Cypher
.Merge("(e1:Entity {Id: $id1})")
.Merge("(e2:Entity {Id: $id2})")
.Merge("(e1)-[r:REF {LINE:$line}]->(e2)")
.WithParams(new { id1, id2, line });
应该做你真正想做的事。
如果e1
和 e2
不在数据库中,则为 CREATE
d ;如果在数据库中,则为 MATCH
ed。
您可能需要考虑是否希望以相同的方式建立关系,在这种情况下,请将 .Create(...)
交换为
编辑:我在你原来的查询中注意到你实际上做了
.Merge(...)
MERGE
关系,所以我相应地更新了代码。