#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;() }) .Синхронизация результатов;