将 Neo4j 节点的 <id> 获取到 class

Get <id> of the Neo4j node into class

我的Class定义:

public class User{
    public int Id {get;set;}
    public string Name {get;set;}
}

我的密码:

MATCH (u:User)
WHERE id(u) = 15
RETURN u{.*, id:id(u)} as user

我的 C#.Net 代码:

var users = await graphClient.Cypher.Match("(u:User)").Where("id(u)=15).Return<User>(u => u.As<User>()).ResultAsync;

当我检查结果时,User.Id 总是 NULL。

注意:我没有在节点内创建和 Id 属性 但我想使用 Neo4j 的内置 Id。

您在浏览器中看到的 <id> 是底层 Neo4j ID,它不是正常的 属性 节点 Id 属性 User class 将尝试获取。

为了得到你想要的东西,你必须对代码做更多的事情,事实上,你的 Cypher 中的大部分内容。

var users = await graphClient.Cypher
    .Match("(u:User)")
    .Where("id(u)=15")
    .With("u{.*, Id:id(u)} AS user")
    .Return(user => user.As<User>())
    .ResultsAsync;

我将转换为 With 中的类型主要是因为这意味着我可以使用 .* 表示法,并且还允许我然后 return user.As<User>().

我也将 Id 属性 你 return 的大小写从 id:id(u) 更改为 Id:id(u) - 就像你的 class 是大写。

我建议也为 Id 使用参数:

var users = await graphClient.Cypher
    .Match("(u:User)")
    .Where("id(u)=$id")
    .With("u{.*, Id:id(u)} AS user")
    .WithParam("id", 15)
    .Return(user => user.As<User>())
    .ResultsAsync;

因为它会让 Neo4j 的查询分析器识别出这是多次 运行 的同一个查询,并使您的查询更快。

现在 - 关于这一点,除非在极少数情况下,否则您真的不应该将 <id> 用作可查询参数。 <id> 可以指向不同时间的数据库。例如,如果您删除了此用户并添加了另一个用户,那么新用户可能会重用 <id>。如果可以,请始终尝试找到另一个要使用的唯一 ID,在 .NET 中,Guid.NewGuid() 是 classics 之一,或者当然,对于用户 - 电子邮件地址往往是好的。