我无法弄清楚ID在Neo4jClient中的工作方式。我希望我的.NET模型具有标识符属性,理想情况下我只想使用该节点的Neo4j自动增量id。
但是,无论我在我的模型类中使用什么情况(id
,ID
,Id
),它总是将其添加为Neo4j中的另一个字段(当它保持为0时我创建了一个新节点)。因此,当我在Neo4j浏览器中查看该节点时,它具有自动递增的<id>
,以及始终为0的id
字段(除非我在C#中的模型中手动设置它)
我希望能够创建一个新的.NET模型类(最初的未初始化ID为0),然后一旦我使用Neo4j流畅的Cypher查询创建它,它将具有来自新创建的节点的自动增量ID。
这里的例子: https://github.com/Readify/Neo4jClient/wiki/cypher-examples
显示他们的User
类有这样的ID:
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,我显然不知道它直到它为止创建
答案 0 :(得分:4)
Alessandro是正确的,你不应该使用节点ID肯定不会作为内部表示的映射。如果您要删除节点,然后创建另一个节点,它可能具有相同的ID。
现在,有时候需要来获取ID,(再次不用作内部标识符) - 但可能在路径结果或其他内容中,并且Neo4jClient
确实允许你获得它。
请注意,这就是龙的谎言。
Neo4jClient
是关于POCO的,它可以帮助你将它们转换为Neo4j和来自Neo4j,WIKI的例子只是一个例子,ID可能来自任意数量的来源,或者是任何类型例如,我经常使用GUID
来获取我的ID。同样,我过去曾使用像SnowMaker之类的东西来生成ID。如果您需要节点ID,则需要将POCO包装在Node<T>
类型中,以便:
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
1}} / POCO位。
答案 1 :(得分:3)
使用来自Neo4j的id是一种错误的做法,因为它可能会随着时间的推移而改变或被分配到不同的节点。 看看这个插件:
https://github.com/graphaware/neo4j-uuid
干杯,