Ошибка DotNet Neo4jClient: Neo4j вернул правильный ответ, однако Neo4jClient не смог десериализоваться в предоставленную вами структуру объектов

#c# #.net #neo4j #cypher #neo4jclient

Вопрос:

В настоящее время я использую клиент Neo4J для .Сеть для нового проекта. Ранее я уже использовал клиент в другом проекте и пытался повторно использовать свой код, но столкнулся с ошибкой, которой у меня никогда раньше не было. Neo4j вернул правильный ответ, однако Neo4jClient не смог десериализоваться в предоставленную вами структуру объектов

Я уже много искал, но не могу найти ответ на свою проблему. Моя установка:

  • Веб-API с.СЕТЕВАЯ структура 4.8
  • Neo4jClient версии 4.1.15, установленный из NuGet
  • Рабочий стол Neo4J с базой данных Neo4J версии 4.3.1
  • Также протестировано с настольным компьютером Neo4J с базой данных Neo4J версии 3.5.30

Таким образом, в основном у меня есть база данных Neo4J, которая содержит некоторые узлы с меткой «Тип объекта», которые подключены к узлам с меткой «Таблица» через тип отношений «IS_CREATED_IN». Теперь я хочу запросить типы объектов и таблицы.

Мой код на C# таков:

 var q = Client.Cypher .Match("(node:ObjectType)-[e:IS_CREATED_IN]-gt;(table)") .Return((node, e, table) =gt; new {  node = node.Aslt;Nodelt;stringgt;gt;() });  

При этом я всегда получаю ошибку **Neo4j вернул правильный ответ, однако Neo4jClient не смог десериализоваться в структуру объекта, которую вы предоставили **.

Я изменил тип узлов с узла на NodeObjectTypeDto. Это работает, но я хочу создать более общие методы, чтобы использовать их в базовой версии. Поэтому я хочу использовать тип узла, но не могу понять, как я могу это сделать.

 public class NodeObjectTypeDto {   public string Id { get; set; }   public string Name { get; set; }   public string Alias { get; set; }   public string Description { get; set; }   public string ENTRYCOUNT { get; set; } }  

В моем предыдущем проекте я использовал приведенную ниже настройку. Там использование узла.Какlt;Узелgt;()lt;Узелgt; работал нормально.

  • Neo4jClient в версии 2.0.0.9
  • Сервер Neo4J с базой данных Neo4J версии 3.4.1

Вот выдержка из возвращенного необработанного JSON Neo4J:

 {"columns":["node"],"data":[{"row":[{"Description":"MATERIAL","Alias":"MATERIAL","ENTRYCOUNT":16968,"Id":29585,"Name":"MATERIAL"}],"meta":[{"id":62937,"type":"node","deleted":false}]},{"row":[{"Description":"MATERIAL","Alias":"MATERIAL","ENTRYCOUNT":16968,"Id":29585,"Name":"MATERIAL"}],"meta":[{"id":62937,"type":"node","deleted":false}]}]  

У кого-нибудь есть идеи, как я могу решить эту проблему?

Ответ №1:

Проблема с использованием Nodelt;stringgt; заключается в том, что все, что вы получаете, — это необработанный JSON, и в этот момент вы также можете использовать стандартный клиент REST (при использовании GraphClient ) или драйвер Neo4j. (при использовании BoltGraphClient ), поскольку оба они обеспечивают более «базовое» соединение на уровне.

Сказав это, Nodelt;stringgt; подход должен сработать, и я не уверен, когда он перестал работать.

На данный момент единственным реалистичным способом заставить его работать был бы пиар, позволяющий ему выполнять конвертацию, и, если честно, я немного удивлен, что он также не работает с версией http, поскольку я достаточно уверен, что это не было затронуто.

Если это так, то другая «причина» может заключаться в том, что Neo4j сам по себе больше не выдает выходные данные, которые можно правильно проанализировать.

Все это, к сожалению, линии «расследования», а не «ответы».

Комментарии:

1. Спасибо тебе, Шарлотта, за твой ответ! В настоящее время я изучаю, в какой версии Neo4J GraphClient этот подход снова возможен. Я опубликую здесь, если узнаю. Я думаю, что на данный момент я останусь со своим определенным типом NodeObjectTypeDto .

2. Мое текущее решение выглядит следующим образом: var QueryResult = ожидание клиента. Шифр. Совпадение(«(узел:тип объекта)-[e:IS_CREATED_IN]-gt;(таблица)»).Набор(«узел.Neo4JId = идентификатор(узла)») .Набор(«узел. Метки = метки(узел)») .Набор(«таблица.Neo4JId = идентификатор(таблица)») .Набор(«стол. Метки = метки(таблица)») .Возврат((узел, таблица) =gt; новый { Тип объекта = узел. Какlt;NodeObjectTypeDtogt;(), TableDtos = таблица. CollectAsDistinctlt;NodeTableDtogt;() }) .Синхронизация результатов;