在特定条件下在 Neo4j 中创建节点和边

Creating Node and Edge in Neo4j on Certain Conditions

我目前正在尝试将唯一位置列表添加到 Neo4j(合并)中。如果 Location 节点具有 OwnerId 的值,那么我想创建与匹配的 Owner 节点的关系并添加一个名为 ManagedLocation 的新标签。

public class Location
{
    public string Name {get;set;}
    public string Built {get;set;}
    public long OwnerId {get;set;}
}

public class Owner
{
    public long Id {get;set;
    public string Name {get;set;}
}

我遇到的问题是 添加 OwnerId 具有值的那些而忽略其余部分。答案可以使用 Neo4jClient 或原始 CYPHER 进行编码,我可以从那里解决剩下的问题。如有任何问题,请随时提出澄清

这是我目前的情况:

 graphClient.Cypher
                    .Unwind(locs, "loc")
                    .Match("(t:Owner{ Id: loc.OwnerId}) RETURN t LIMIT 1")
                    .Merge("(l:Location {Name: loc.Name})")
                    .OnCreate()                        
                    .Set("l = loc")
                    .Create("(t)-[:Manages]->(l)")
                    .Set ("l = ManagedLocation")
                    .ExecuteWithoutResults();

这一切都与您的代码顺序有关,在未设置 OwnerId 的情况下 - MATCH 将失败 - 因此不会继续查询。您必须首先在位置上执行 MERGE

graphClient.Cypher
    .Unwind(locs, "loc")
    .Merge("(l:Location {Name: loc.Name})")
    .OnCreate()
    .Set("l = loc")
    .With("l")
    .Match("(t:Owner { Id: l.OwnerId})")
    .Create("(t)-[:Manages]->(l)")
    .Set("l:ManagedLocation")
    .ExecuteWithoutResults();

附带说明 - 您可能希望关系的底部 .Create 也是 Merge - 这样您就可以 运行 查询任意多次不创建重复关系。