最初的问题源于您使用的旧代码在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
缺点是您必须自己控制 Session 和 Driver 对象的生命周期 - 即您不能只使用 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
您仍然需要管理 Session 和 Driver 实例的生命周期。
希望有帮助