我目前正在尝试向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();
答案 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>