Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在c neo4jClient中创建唯一的节点(如果已经存在,则不重复)?_C#_Neo4j_Neo4jclient - Fatal编程技术网

C# 如何在c neo4jClient中创建唯一的节点(如果已经存在,则不重复)?

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(); 合并似乎没有

我正在尝试做以下对neo4J cypher来说很简单的事情

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的情况下合并?