【问题标题】:Neo4j v4 Driver Errors in .NET.NET 中的 Neo4j v4 驱动程序错误
【发布时间】:2020-04-16 19:41:48
【问题描述】:

我的 VB.NET 代码使用 Imports Neo4j.v1 和 Neo4j 3.x 运行良好

我已经在我的笔记本电脑(社区版)上升级到 Neo4j 4.01 服务器,并且可以在 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

它崩溃是使用 session=D.Session() 行,错误为

重载解析失败,因为没有可访问的“会话”接受此数量的参数。

我研究了https://neo4j.com/docs/driver-manual/current/session-api/simple/的背景资料,但看不出问题。我在使用 Python 代码的 Azure 上的 Neo4j v4 遇到了类似的问题。

不胜感激建议的修复。

【问题讨论】:

  • 从错误来看,会话构造函数需要参数。从您链接的文档中 - 可以通过多种不同方式配置会话。这是通过在会话构造函数中提供配置来执行的。有关详细信息,请参阅第 4.4 节“会话配置”。
  • 我阅读了第 4.4 节。所有会话配置都有默认值,它们适用于我的场景。所以他们似乎没有必要。前面部分中的所有示例都没有参数,网上其他地方的示例也没有。但我会进一步研究这个可能的解决方法。
  • 认为您可能需要与 Neo4j 提供商交谈。有些东西没有加起来。你得到的错误说你需要构造函数中的参数,但我发现的文档和示例说它不需要
  • 感谢您的提示...它确实带来了解决方案,我现在将记录下来。不幸的是,我不能认为你是应得的。

标签: vb.net neo4j cypher


【解决方案1】:

最初的问题源于您使用的旧代码在Neo4j.Driver 包中具有同步代码,从4.x 开始,Neo4j.Driver 包包含异步代码。

有一个 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 包。他们三个都需要以下Import 语句(这些是基本的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 包 - 使用异步

这条路线确实需要你使用 Async / 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

缺点是您必须自己控制 SessionDriver 对象的生命周期 - 即您不能只使用 Using 语句:/

Neo4j.Driver 包 - 同步方式的异步代码

这是最坏的情况,因为它涉及到你基本上同步异步代码,使用 .Wait() 和一些非常笨重的 ForEaching - 但我认为它会填满示例:

'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

您仍然需要管理 SessionDriver 实例的生命周期。

希望有帮助

【讨论】:

    【解决方案2】:

    解决方案:会话是异步运行的,正如上面赫西建议的那样,它确实需要一个 ConfigBuilder 参数,即使它是“无”。返回与我的 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
    

    【讨论】:

    • 我认为您可能已经摆脱了 Neo4j.Driver.Simple 包 - 这可能有助于解决异步方面的问题 - 尽管您可能仍然遇到 Config Builder 位的问题
    • 你的正确。我仍然无法弄清楚如何让 ConfigBuilder 工作......找不到特定的 VB.NET 示例
    • 我放弃并恢复到 Neo4j.Driver.v1。幸运的是,我的备份驱动器上有它,因为它在 NUGet 中不再可用。驱动程序 4.0 存在我无法解决的故障,并且文档不足以让我弄清楚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多