C# 如何在c neo4jClient中创建唯一的节点(如果已经存在,则不重复)?
我正在尝试做以下对neo4J cypher来说很简单的事情C# 如何在c neo4jClient中创建唯一的节点(如果已经存在,则不重复)?,c#,neo4j,neo4jclient,C#,Neo4j,Neo4jclient,我正在尝试做以下对neo4J cypher来说很简单的事情 merge (ee:Person { id: "id1234" }) 如何确保下一次创建不会在c Neo4Jclient中创建另一个节点 我真的急需这个 client.Cypher.Merge("(user:User {Id: {Id} })") .onCreate() .set("user= {newUser}") .withParams(new { ... } ) .executeWithoutResults(); 合并似乎没有
merge (ee:Person { id: "id1234" })
如何确保下一次创建不会在c Neo4Jclient中创建另一个节点
我真的急需这个
client.Cypher.Merge("(user:User {Id: {Id} })")
.onCreate()
.set("user= {newUser}")
.withParams(new { ... } )
.executeWithoutResults();
合并似乎没有被接受。知道为什么吗?因为即使对象完全相同,它仍会创建一个新节点
谢谢,
R您的语法可能不正确。请使用以下语法防止创建重复节点
GraphClient client = GetNeo4jGraphClient();
client.Connect();
client.Cypher
.Merge("(user:User {Id: {newUser}.Id })")
.OnCreate()
.Set("user = {newUser}")
.WithParams(
new {
newUser =
new {
Id = 1,
Name = "Michael",
Title = "Developer Advocate",
FavoriteDatabase = "Neo4j",
Occupation = "Software Developer"
}
})
.ExecuteWithoutResults();
请注意,我已将上面的Id属性更改为{newUser}.Id
这解决了复制问题,但如果您将其用作获取/创建用户的方法,则不会反映更新。例如,如果我将newUser.Name属性更改为Kenny,并且Id属性保持不变,则创建时的原始属性将优先,并将节点恢复到其原始状态
要解决这个问题,你需要做两件事中的一件
创建一个更新方法
以不带参数的密码发送合并字符串
选项1-创建更新方法
创建一个如下所示的附加方法,为您的用户类交换my dynamic:
GraphClient client = GetNeo4jGraphClient();
client.Connect();
client.Cypher.Match("(user:User {Id: {newUser}.Id })")
.Set("user = {newUser}")
.WithParams(
new
{
newUser =
new
{
Id = 1,
Name = "Kenny",
Title = "Developer Advocate",
FavoriteDatabase = "Neo4j",
Occupation = "Software Developer"
}
})
.ExecuteWithoutResults();
选项2-以不带参数的密码发送合并字符串
我建议直接将Cypher发送到Neo4j服务器,暂时在Neo4jClient中绕过LINQ扩展
请查看此修改后的基于Neo4jClient的CypherQueryCreator.cs文件:
您可以在同一GitHub项目中找到类似的实现:
转到GetRankedNodeForQuery方法
注意:此实现没有利用RESTAPI上推荐使用的参数。为此,请查阅相关文件:
干杯
Kenny您的语法可能不正确。请使用以下语法防止创建重复节点
GraphClient client = GetNeo4jGraphClient();
client.Connect();
client.Cypher
.Merge("(user:User {Id: {newUser}.Id })")
.OnCreate()
.Set("user = {newUser}")
.WithParams(
new {
newUser =
new {
Id = 1,
Name = "Michael",
Title = "Developer Advocate",
FavoriteDatabase = "Neo4j",
Occupation = "Software Developer"
}
})
.ExecuteWithoutResults();
请注意,我已将上面的Id属性更改为{newUser}.Id
这解决了复制问题,但如果您将其用作获取/创建用户的方法,则不会反映更新。例如,如果我将newUser.Name属性更改为Kenny,并且Id属性保持不变,则创建时的原始属性将优先,并将节点恢复到其原始状态
要解决这个问题,你需要做两件事中的一件
创建一个更新方法
以不带参数的密码发送合并字符串
选项1-创建更新方法
创建一个如下所示的附加方法,为您的用户类交换my dynamic:
GraphClient client = GetNeo4jGraphClient();
client.Connect();
client.Cypher.Match("(user:User {Id: {newUser}.Id })")
.Set("user = {newUser}")
.WithParams(
new
{
newUser =
new
{
Id = 1,
Name = "Kenny",
Title = "Developer Advocate",
FavoriteDatabase = "Neo4j",
Occupation = "Software Developer"
}
})
.ExecuteWithoutResults();
选项2-以不带参数的密码发送合并字符串
我建议直接将Cypher发送到Neo4j服务器,暂时在Neo4jClient中绕过LINQ扩展
请查看此修改后的基于Neo4jClient的CypherQueryCreator.cs文件:
您可以在同一GitHub项目中找到类似的实现:
转到GetRankedNodeForQuery方法
注意:此实现没有利用RESTAPI上推荐使用的参数。为此,请查阅相关文件:
干杯
肯尼我将调查此事。我认为在您的情况下,最理想的是直接将Cypher发送给Neo4j。您现在在Neo4jClient中使用什么代码来创建?您是否尝试在没有.onCreate的情况下合并?我将对此进行研究。我认为在您的情况下,最理想的是直接将Cypher发送给Neo4j。您现在使用什么代码与Neo4jClient一起创建?您是否尝试在不使用.onCreate的情况下合并?