将 Neo4j 连接到 Android 时出现错误

While Connecting to Neo4j to Android I'm getting an error

我想在我的 Android 项目中使用 neo4j DB。我正在尝试使用 Android 连接 Neo4j 数据库,但在连接时出现错误。我在 Android 应用级别 gradle 中添加了一个依赖项。

compile 'org.neo4j.driver:neo4j-java-driver:1.3.0'

MainActivity.java

Driver driver = GraphDatabase.driver( "bolt://localhost:7687", AuthTokens.basic("neo4j", "neo4j") );
                Session session = driver.session();
                session.run( "CREATE (a:Person {name: {name}, title: {title}})",
                        parameters( "name", "Arthur", "title", "King" ) );

                StatementResult result = session.run( "MATCH (a:Person) WHERE a.name = {name} " +
                                "RETURN a.name AS name, a.title AS title",
                        parameters( "name", "Arthur" ) );
                while ( result.hasNext() )
                {
                    Record record = result.next();
                    System.out.println( record.get( "title" ).asString() + " " + record.get( "name" ).asString() );
                }
                session.close();
                driver.close();

日志

06-22 16:24:05.627 4990-4990/com.example.prateek.neo4jtest E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.prateek.neo4jtest, PID: 4990
java.lang.NoClassDefFoundError: java.net.StandardSocketOptions
at org.neo4j.driver.internal.net.ChannelFactory.create(ChannelFactory.java:39)
at org.neo4j.driver.internal.net.SocketClient.start(SocketClient.java:124)
at org.neo4j.driver.internal.net.SocketConnection.startSocketClient(SocketConnection.java:92)
at org.neo4j.driver.internal.net.SocketConnection.<init>(SocketConnection.java:67)
at org.neo4j.driver.internal.net.SocketConnector.createConnection(SocketConnector.java:77)
at org.neo4j.driver.internal.net.SocketConnector.connect(SocketConnector.java:50)
at org.neo4j.driver.internal.net.pooling.SocketConnectionPool$ConnectionSupplier.get(SocketConnectionPool.java:204)
at org.neo4j.driver.internal.net.pooling.SocketConnectionPool$ConnectionSupplier.get(SocketConnectionPool.java:186)
at org.neo4j.driver.internal.net.pooling.BlockingPooledConnectionQueue.acquire(BlockingPooledConnectionQueue.java:96)
at org.neo4j.driver.internal.net.pooling.SocketConnectionPool.acquireConnection(SocketConnectionPool.java:137)
at org.neo4j.driver.internal.net.pooling.SocketConnectionPool.acquire(SocketConnectionPool.java:76)
at org.neo4j.driver.internal.DirectConnectionProvider.acquireConnection(DirectConnectionProvider.java:45)
at org.neo4j.driver.internal.NetworkSession.acquireConnection(NetworkSession.java:340)
at org.neo4j.driver.internal.NetworkSession.run(NetworkSession.java:104)
at org.neo4j.driver.internal.NetworkSession.run(NetworkSession.java:94)
at com.example.prateek.neo4jtest.MainActivity.onClick(MainActivity.java:29)
at android.view.View.performClick(View.java:4438)
at android.view.View$PerformClick.run(View.java:18431)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:149)
at android.app.ActivityThread.main(ActivityThread.java:5045)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:610)
at dalvik.system.NativeStart.main(Native Method)

如有任何帮助,我们将不胜感激。 谢谢!

仅仅因为有一个 Java 驱动程序,并不意味着它可以在 Android 上运行。

(不过,Github 上似乎有一个过时的 Android 驱动程序)

Neo4j exposes a REST API 你可以使用给定的 HTTP 请求,这可能是最安全的使用方法,尽管它需要学习它如何在 Android 上工作并处理 JSON解析。

更具体的错误,StandardSocketOptions 在 API 24 之前不是 Android 的一部分,因此您可以尝试将 compileSdk 和 minimumSdk 设置为 24,但不能保证它仍然会工作。


顺便说一下,您无法从 Android 设备连接到 localhost,除非您是该 Android 设备本身上的 运行 Neo4j 服务器

java.net.StandardSocketOptions 已添加到 Android 平台 API 级别 26。

因此,如果您的应用可以接受 API 级别 26 或更高级别,那么您至少可以通过该异常。但是,您可能仍会看到与驱动程序所需的其他 类 类似的问题。