Cypher流畅查询中的返回关系属性

时间:2014-05-23 15:04:34

标签: c# neo4j cypher fluent neo4jclient

我有以下Neo4jClient流畅的API查询,用于返回存储在我的Neo4j数据库中的Xbox游戏的本地化文本:

var localized = client.Cypher
       .OptionalMatch("(xb:`XboxProfile`)-[p:PLAYS]->(g:`XboxGame`)-[:LOCALE]->(l:`XboxGameLocalized`)")
       .Where((Xbox.Profile xb) => xb.GamerTag == xboxProfile.GamerTag)
       .AndWhere((Xbox.Localization.Game l) => l.Locale == locale)
       .Return((l, g, p) => new {
           Localized = l.As<Xbox.Localization.Game>(),
           Game = g.As<Xbox.Game>(),
           LastPlayed = p.As<DateTimeOffset>()
       })
       .Results.ToList();

PLAYS关系中,我有一个LastPlayed属性,我希望在查询结果集中返回DateTimeOffset。目前,p.As<DateTimeOffset>并未按预期工作。它没有解析日期,日期返回为:
0001-01-01T00:00:00Z

返回关系属性/属性的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

问题是您的查询中的p是一个完整的对象(或包),但您没有符合所需的属性:

LastPlayed = p.As<DateTimeOffset>()

因为它无法将整个对象反序列化为DateTimeOffset,但它不是可以为空的类型,所以您将获得默认值。

您只需要为了IntelliSense而描述p的类型:

public class PlaysPayload
{
    public DateTimeOffset LastPlayed { get; set; }
}

然后在查询中使用它来解决您想要的属性:

   .Return((l, g, p) => new {
       Localized = l.As<Xbox.Localization.Game>(),
       Game = g.As<Xbox.Game>(),
       LastPlayed = p.As<PlaysPayload>().LastPlayed  // <-- this line is different
   })

需要使用Relationship<T>RelationshipInstance<T>

免责声明:我正在早上6点30分在机场打电话,而他们正在打电话给我的飞机。我是Neo4jClient的作者,所以它应该是正确的,但我还没有验证这个特定的解决方案。