Ошибки драйвера Neo4j v4 в. NET - PullRequest
0 голосов
/ 16 апреля 2020

Мой VB. NET код работал прекрасно с использованием Imports Neo4j.v1 и Neo4j 3.x

Я обновился до сервера Neo4j 4.01 на своем ноутбуке (Community Editon) и могу подключиться и успешно выполнить запрос в Neo4j Desktop. Я использовал NUGet, чтобы удалить старую ссылку на Neo4j и добавить драйвер Neo4j 4.01. Код больше не работает.

    Imports Neo4j.Driver
    Dim D = GraphDatabase.Driver(uri:=Neo4Lib.Neo4ConnectionString, authToken:=AuthTokens.Basic(Neo4Lib.Neo4UserName, Neo4Lib.Neo4Pswd))
    Using session = D.Session()
    'query database
    Dim rslt = session.run(CQ)
       .... processing ...
    End Using

Вылетает строка Using session = D.Session () с ошибкой

Не удалось разрешить перегрузку из-за отсутствия доступного сеанса принимает это количество аргументов.

Я изучил справочные материалы по https://neo4j.com/docs/driver-manual/current/session-api/simple/, но не вижу проблемы. У меня были похожие проблемы с Neo4j v4 на Azure с кодом Python.

Буду признателен за предложенные исправления.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2020

Первоначальная проблема связана с тем, что старый код, который вы использовали, имел код Syn c в пакете Neo4j.Driver, начиная с 4.x и далее пакет Neo4j.Driver содержит только Asyn c код.

Существует пакет Neo4j.Driver.Simple (https://www.nuget.org/packages/Neo4j.Driver.Simple/), который будет действовать так же, как и версии 1.7x. В качестве краткого примечания - невозможно удалить пакет из Nuget - как только он опубликован, он всегда там - 1.7.2 здесь: https://www.nuget.org/packages/Neo4j.Driver/1.7.2 - в худшем случае - он может быть скрыт - но в этом случае вам просто нужно явно запросить версию. Так что вам не нужно беспокоиться о сохранении старых версий.

Я написал 3 примера (ниже), которые показывают использование нового драйвера от VB с выбранных углов, используя только пакет Neo4j.Driver и используя пакет Neo4j.Driver.Simple. Все 3 из них нуждаются в следующих Import заявлениях (и это основные c Console приложения). Кроме того, ни один из них не нуждается в параметре ConfigBuilder.

'The imports
Import System
Import Neo4j.Driver
Import System.Threading.Tasks

Neo4j.Driver.Simple версия

Поскольку это наиболее близко к версии 1.7.2 - я поставлю это первым:

Sub Main
    SyncVersion()
End Sub

Sub SyncVersion()
    Dim query = "MATCH (m:Movie) RETURN m"

    'NB. Driver could be in a 'Using' on this.
    Dim driver = GraphDatabase.Driver(uri:="neo4j://localhost:7687", authToken:=AuthTokens.Basic("neo4j", "neo"))

    'Open the session
    Using session = driver.Session()
        Dim result As IResult = session.Run(query)
        For Each record As IRecord In result
            Console.WriteLine(record("m").Properties("title"))
        Next
    End Using

    'Close the driver
    driver.Dispose()
End Sub

Преимущества этого в том, что он должен точно соответствовать вашей кодовой базе с минимальными изменениями для вас.

Neo4j.Driver пакет - с использованием Asyn c

Этот маршрут требует от вас использования Asyn c / Await:

'Note - This is also declared as Async
Async Sub Main
    AsyncVersion()
End Sub

Async Function AsyncVersion() As Task
    Dim query = "MATCH (m:Movie) RETURN m"
    Dim driver = GraphDatabase.Driver(uri:="neo4j://localhost:7687", authToken:=AuthTokens.Basic("neo4j", "neo"))

    'Open the session
    Dim session = driver.AsyncSession()

    'Get the result cursor
    Dim result As IResultCursor = Await session.RunAsync(query)

    'Loop through it
    While Await result.FetchAsync()
        Console.WriteLine(result.Current("m").Properties("title"))
    End While

    'Close the session
    Await session.CloseAsync()
    'Close the driver
    Await driver.CloseAsync()
End Function

Недостатками являются то, что вы сами должны контролировать жизненный цикл объектов Session и Driver - то есть вы не можете просто используйте оператор Using: /

Neo4j.Driver package - Asyn c код в Syn c way

Это наихудший вариант развития событий, так как он включает в себя в основном син c - уточняющий асиновый c код, использующий .Wait() и некоторые очень неуклюжие ForEach ing - но я думал, что это заполнит примеры:

'Not Async this time
Sub Main
    SyncWithAsync()
End Sub

Sub SyncWithAsync()
    Dim query = "MATCH (m:Movie) RETURN m"
    Dim driver = GraphDatabase.Driver(uri:="neo4j://localhost:7687", authToken:=AuthTokens.Basic("neo4j", "neo"))

    'Open the session
    Dim session = driver.AsyncSession()

    'Get the result cursor
    Dim resultTask As Task(Of IResultCursor) = session.RunAsync(query)
    resultTask.Wait()

    'Loop through it, but as we're 'syncing' an async, we need to wait for 'fetch' to work.
    Dim fetchTask = resultTask.Result.FetchAsync()
    fetchTask.Wait()
    While fetchTask.Result
        Console.WriteLine(resultTask.Result.Current("m").Properties("title"))
        fetchTask = resultTask.Result.FetchAsync()
        fetchTask.Wait()
    End While

    'Close the session
    session.CloseAsync().Wait()

    'Close the driver
    driver.CloseAsync().Wait()
End Sub

Вам все равно придется управлять жизнью цикл экземпляров Session и Driver.

Надеюсь, это поможет

0 голосов
/ 17 апреля 2020

Решение: сеанс был запущен асинхронно, и, как предложил Хурси, для него требовался аргумент ConfigBuilder, даже если это было «Nothing». Возврат отличается от моего кода для Neo4j 3.x, поэтому мне нужно написать новый код синтаксического анализа ... но теперь у меня есть с чем поработать!

    Imports Neo4j.Driver

    CQ={neo4j cypher query}
    Dim D = GraphDatabase.Driver(uri:=Neo4Lib.Neo4ConnectionString, authToken:=AuthTokens.Basic(Neo4Lib.Neo4UserName, Neo4Lib.Neo4Pswd))
    Dim cb As ConfigBuilder = Nothing

    Using session = D.AsyncSession(cb)
     'query database
        Dim rslt As System.Threading.Tasks.Task = session.RunAsync(CQ)
              {process IResultCursor}
    End Using
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...