Возвратите атрибут отношения в свободном запросе Cypher

1

У меня есть следующий беспроблемный запрос API Neo4jClient, который используется для возврата локализованного текста для игр Xbox, хранящихся в моей базе данных Neo4j:

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

Каков правильный способ возврата атрибутов/свойств отношений?

Теги:
neo4j
cypher
fluent
neo4jclient

1 ответ

2
Лучший ответ

Проблема в том, что p в вашем запросе является целым объектом (или сумкой), но вы не квалифицируете требуемое свойство:

LastPlayed = p.As<DateTimeOffset>()

Поскольку он не может десериализовать весь объект в DateTimeOffset, но он не является типом NULL, вы получаете значение по умолчанию.

Вам просто нужно описать тип p для IntelliSense:

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>.

Отказ от ответственности: я печатаю это в 06:30 утра, а в аэропорту, пока они звонят на моем самолете. Я автор Neo4jClient, поэтому он должен быть правильным, но я не проверял это конкретное решение.

  • 0
    Спасибо Татам! Я знаю, что вы автор Neo4jClient, и я видел ваши другие отличные ответы на Neo4jClient. Поздравляю, чтобы сделать это до 3000 представителей!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню