Neo4j - Neo4jClient - десериализация из результатов Cypher - PullRequest
0 голосов
/ 26 апреля 2020

У меня есть базовая c Neo4j DB, и я собираюсь получить данные из нее в C# в. Net Core. Я использую болтовое соединение на 4.03 DB. Windows 10. Возможно, я еще не понял базы данных графов, но я пытаюсь создать объект Person, содержащий позиции, содержащие навык, а затем ранги

Этот код возвращает 6 экземпляров Person (небольшое беспокойство по поводу того, что я есть 6, но это небольшая проблема)

var cv = client.Cypher.Match("(person:Person {UserNumber:5})-[:HAS]->(position:Position)<-[:WITHIN]-(skill:Skill)<-[:ON]-(rank:Rank)")
           .Return(person => person.As<Person>());

Класс Person

    public class Person
    {
        public Person() {
            RankingProfile = new List<decimal>();
            EmailConfirmed = false;
        }
        …lots of variables (dates, string decimals, boolean)
        public List<decimal> RankingProfile { get; set; }
    }

Изменение формата результата, чтобы попытаться построить составной объект, но начиная с просто Person (добавили. Результаты чтобы получить исключение) я получаю инициализатор типа не вызывается. Исключение.

var cv = client.Cypher.Match("(person:Person {UserNumber:5})-[:HAS]->(position:Position)<-[:WITHIN]-(skill:Skill)<-[:ON]-(rank:Rank)")
            .Return(person => new {
                Person = person.As<Person>()
            }).Results;

Дает мне исключение ниже. Копание в исключении подразумевало, что я нуждался в конструкторе без параметров, который я добавил. Бит потерян сейчас.

  System.Reflection.TargetInvocationException
  HResult=0x80131604
  Message=Exception has been thrown by the target of an invocation.
  Source=Neo4jClient
  StackTrace:
   at Neo4jClient.BoltGraphClient.Neo4jClient.IRawGraphClient.ExecuteGetCypherResults[TResult](CypherQuery query)
   at Neo4jClient.Cypher.CypherFluentQuery`1.get_Results()
   at SonOFMatrix.Controllers.CVController.Get() in C:\Users\Controllers\CVController.cs:line 29
   at Microsoft.Extensions.Internal.ObjectMethodExecutor.Execute(Object target, Object[] parameters)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.SyncObjectResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeActionMethodAsync()
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeNextActionFilterAsync()

  This exception was originally thrown at this call stack:
    [External Code]

    Inner Exception 1:
    MemberAccessException: Type initializer was not callable.
        StackTrace  "   
        at System.Reflection.RuntimeConstructorInfo.ThrowNoInvokeException()
        at System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
        at System.Reflection.ConstructorInfo.Invoke(Object[] parameters) 
        at Neo4jClient.StatementResultHelper.ConstructNew[T]()  
at Neo4jClient.StatementResultHelper.Parse[T](IRecord record, String identifier, IGraphClient graphClient)" string

1 Ответ

0 голосов
/ 03 мая 2020

Это не помогло из-за даты и времени, которые я использовал. Дата и время в базе данных имели следующий формат (включая часовой пояс) «1939-06-23T01: 00: 00 + 01: 00». Отрезав +01: 00 от конца, он работал с объектом Person с датой и временем

public DateTime BirthDate { get; set; }

с использованием Neo4j.Driver.V1 в классе объектов, что позволило мне указать ZonedDateTime. Который работал с оригинальным форматом даты, который включал часовой пояс

public ZonedDateTime BirthDate { get; set; }

Большое спасибо, Крис без твоих комментариев, я бы споткнулся намного дольше.

...