Vb.net NET中的Neo4j v4驱动程序错误

Vb.net NET中的Neo4j v4驱动程序错误,vb.net,neo4j,cypher,Vb.net,Neo4j,Cypher,使用导入的Neo4j.v1和Neo4j 3.x,我的VB.NET代码运行得非常好 我已经升级到笔记本电脑上的Neo4j 4.01服务器(Community Editon),可以在Neo4j桌面上成功连接和查询。我使用NUGet删除旧的Neo4j引用并添加NEO4J4.01驱动程序。代码不再有效 Imports Neo4j.Driver Dim D = GraphDatabase.Driver(uri:=Neo4Lib.Neo4ConnectionString, authToken

使用导入的Neo4j.v1和Neo4j 3.x,我的VB.NET代码运行得非常好

我已经升级到笔记本电脑上的Neo4j 4.01服务器(Community Editon),可以在Neo4j桌面上成功连接和查询。我使用NUGet删除旧的Neo4j引用并添加NEO4J4.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()行,错误为

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

我已经在研究了背景材料,但看不出问题所在。我在Azure上使用Python代码的Neo4jV4时也遇到过类似的问题


非常感谢建议的修复。

解决方案:会话是异步运行的,正如上面Hursey所建议的,它确实需要一个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

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

有一个
Neo4j.Driver.Simple
package(),它的作用类似于
1.7x
版本。作为一个简短的补充说明-不可能从Nuget中删除一个包-一旦发布,它总是在那里-一个
1.7.2
在这里:-最坏的情况下-它可能是隐藏的-但在这种情况下,你只需要明确要求版本。因此,您不必担心保留旧版本

我已经写了3个示例(如下),展示了如何从一系列角度使用VB中的新驱动程序,只使用
Neo4j.driver
包和
Neo4j.driver.Simple
包。这三个应用程序都需要以下
Import
语句(它们是基本的
Console
apps)。另外-它们都不需要
ConfigBuilder
参数

'The imports
Import System
Import Neo4j.Driver
Import System.Threading.Tasks
Neo4j.Driver.Simple
version 由于这是最接近
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
package-使用异步 此路由确实需要您使用异步/等待:

'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
缺点是您必须自己控制
会话
驱动程序
对象的生命周期-即,您不能仅使用
使用
语句:/

Neo4j.Driver
package-同步方式的异步代码 这是最糟糕的情况,因为它涉及到基本上同步异步代码,使用
.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
您仍然需要管理
会话
驱动程序
实例的生命周期


希望这有助于排除错误,会话构造函数需要参数。从您链接的文档中,可以通过多种不同的方式配置会话。这是通过在会话构造函数中提供配置来实现的。有关更多详细信息,请参阅第4.4节“会话配置”。我阅读了第4.4节。所有会话配置都有默认值,它们适用于我的场景。因此,它们似乎没有必要。前几节中的所有示例都没有参数,网上其他地方的示例也没有参数。但我会进一步研究这个可能的解决方案。我想你可能需要和Neo4j供应商谈谈。有些东西不合逻辑。您得到的错误表明您需要构造函数中的参数,但我发现的文档和示例表明它不需要提示。。。正如我现在要记录的那样,它确实带来了一个解决方案。不幸的是,我不能相信你是当之无愧的。我认为你可能已经逃脱了
Neo4j.Driver.Simple
包的惩罚——这可能有助于事情的异步方面——尽管你可能仍然存在配置生成器的问题。我仍然不知道如何让ConfigBuilder工作。。。找不到特定的VB.NET示例我放弃并恢复为Neo4j.Driver.v1。幸运的是,我的备份驱动器上有它,因为它在NUGet中不再可用。驱动程序4.0有我无法解决的小故障,并且文档不足以让我解决它。