Neo4jClient node ids

本文关键字:ids node Neo4jClient | 更新日期: 2023-09-27 18:20:01

我很难弄清楚ID在Neo4jClient中的工作方式。我希望我的.NET模型有一个标识符属性,理想情况下,我希望它只使用该节点的Neo4j自动递增id。

然而,无论我在模型类中使用什么情况(idIDId),它总是将其添加为Neo4j中的另一个字段(在创建新节点时将其保持为0)。因此,当我在Neo4j浏览器中查看该节点时,它有一个自动递增的<id>,还有一个始终为0的id字段(除非我在C#中的模型中手动设置它)。

我希望能够创建一个新的.NET模型类(它最初将具有未初始化的id 0),然后一旦我使用Neo4j fluent Cypher查询创建了它,它将具有来自新创建节点的自动递增id的id。

此处的示例:https://github.com/Readify/Neo4jClient/wiki/cypher-examples

显示其具有如下ID的User类:

public long Id { get; set; }

但在创建新用户的示例中。。。

var newUser = new User { Id = 456, Name = "Jim" };
graphClient.Cypher
    .Create("(user:User {newUser})")
    .WithParam("newUser", newUser)
    .ExecuteWithoutResults();

我不确定这个456幻数在这个例子中是从哪里来的,但我只希望它是Neo4j id,显然在它创建之前我不知道。

Neo4jClient node ids

Alessandro是正确的,您不应该使用节点ID,当然不应该将其用作内部表示的映射。如果你要删除一个节点,然后创建另一个,它很可能有相同的ID。

现在,有时需要来获取ID(同样不是用作内部标识符),但可能是在Path结果或其他内容中,Neo4jClient确实允许您获取它。

小心,龙就这样躺着

Neo4jClient是关于POCO的,它可以帮助你将它们翻译成Neo4j和Neo4j,WIKI的例子只是,例如,ID可以来自任何数量的来源,也可以是任何类型,例如,我经常使用GUIDs作为我的ID。同样,我过去也使用过类似SnowMaker的东西来生成ID。如果你想要节点ID,你需要用Node<T>类型包装你的POCO,所以:

client.Cypher.Match("(n:User)").Return(n => n.As<User>()).Results;

获得IEnumerable<User>响应,而:

client.Cypher.Match("(n:User)").Return(n => n.As<Node<User>>()).Results;

得到一个IEnumerable<Node<User>>响应,其中Node<T>的每个实例都有一个属性-Reference,它是Neo4j ID,另一个属性Data,它是T/POCO位。

使用Neo4j中的id是错误的做法,因为它可能会随着时间的推移而更改或分配到不同的节点。看看这个插件:

https://github.com/graphaware/neo4j-uuid

干杯,