在某些条件下在Neo4j中创建节点和边缘

时间:2018-06-11 12:32:15

标签: c# neo4j neo4jclient

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

docs

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();

1 个答案:

答案 0 :(得分:1)

这与代码的排序有关,在OwnerId未设置的情况下 - MATCH将失败 - 因此赢得了#t继续查询。您必须先在该位置执行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 - 因此您可以根据需要多次运行查询,而不会创建重复的关系。< / p>