我如何让 Gremlin-Python 和 gremlin-server 3.4.3 一起工作?

How do i get Gremlin-Python with gremlin-server 3.4.3 to work?

我的环境是:

java -version
java version "1.8.0_172"
Java(TM) SE Runtime Environment (build 1.8.0_172-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.172-b11, mixed mode)

python3 --version
Python 3.7.4

这应该是唯一相关的环境部分。不幸的是,我在 MacOS 上使用 macports 可能会有所不同,这应该不是问题。

我刚刚在 Ubuntu 18.04 LTS 上进行了测试,参见 http://wiki.bitplan.com/index.php/Gremlin_python#Installlation_automation 并且行为是相同的。

所以我想试试 gremlin-python。 我发现 https://pypi.org/project/gremlinpython/ 并愉快地添加

gremlinpython

给我的 requirements.txt

sudo -H pip install -r requirements.txt

运行 成功了-太棒了。 让我们找一些 python 代码来玩 .

https://gist.githubusercontent.com/okram/f193d5616563a69ad5714a42c504276f/raw/b8075410e400e18f18360015945f3760d99d044a/gremlin-python-play.py

有。

哦 - 我需要一个服务器...

我们来下载吧

http://ftp-stud.hs-esslingen.de/pub/Mirrors/ftp.apache.org/dist/tinkerpop/3.4.3/apache-tinkerpop-gremlin-server-3.4.3-bin.zip

如上例所述解压缩并为其创建启动文件:

gspath=$HOME/Downloads/apache-tinkerpop-gremlin-server-3.4.3
#$gspath/bin/gremlin-server.sh install org.apache.tinkerpop gremlin-python 3.4.3
$gspath/bin/gremlin-server.sh $gspath/conf/gremlin-server-modern-py.yaml

它不起作用 - 从 tornado 获得 599 超时。

查看:

尝试提示,例如使用 0.0.0.0 作为主机

检查启动。

糟糕 - 出现错误:

Could not initialize gremlin-jython GremlinScriptEngine as init script could not be evaluated
java.util.concurrent.CompletionException: java.lang.IllegalArgumentException: gremlin-jython is not an available GremlinScriptEngine
    at java.util.concurrent.CompletableFuture.reportJoin(CompletableFuture.java:375)
    at java.util.concurrent.CompletableFuture.join(CompletableFuture.java:1934)
    at org.apache.tinkerpop.gremlin.server.util.ServerGremlinExecutor.lambda$new(ServerGremlinExecutor.java:141)
    at java.util.LinkedHashMap$LinkedKeySet.forEach(LinkedHashMap.java:559)
    at org.apache.tinkerpop.gremlin.server.util.ServerGremlinExecutor.<init>(ServerGremlinExecutor.java:136)
    at org.apache.tinkerpop.gremlin.server.GremlinServer.<init>(GremlinServer.java:122)
    at org.apache.tinkerpop.gremlin.server.GremlinServer.<init>(GremlinServer.java:86)
    at org.apache.tinkerpop.gremlin.server.GremlinServer.main(GremlinServer.java:345)
Caused by: java.lang.IllegalArgumentException: gremlin-jython is not an available GremlinScriptEngine
    at org.apache.tinkerpop.gremlin.jsr223.CachedGremlinScriptEngineManager.registerLookUpInfo(CachedGremlinScriptEngineManager.java:95)
    at org.apache.tinkerpop.gremlin.jsr223.CachedGremlinScriptEngineManager.getEngineByName(CachedGremlinScriptEngineManager.java:58)
    at org.apache.tinkerpop.gremlin.groovy.engine.GremlinExecutor.lambda$eval[=15=](GremlinExecutor.java:266)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
[WARN] ServerGremlinExecutor - Could not initialize gremlin-python GremlinScriptEngine as init script could not be evaluated
java.util.concurrent.CompletionException: java.lang.IllegalArgumentException: gremlin-python is not an available GremlinScriptEngine
    at java.util.concurrent.CompletableFuture.reportJoin(CompletableFuture.java:375)
    at java.util.concurrent.CompletableFuture.join(CompletableFuture.java:1934)
    at org.apache.tinkerpop.gremlin.server.util.ServerGremlinExecutor.lambda$new(ServerGremlinExecutor.java:141)
    at java.util.LinkedHashMap$LinkedKeySet.forEach(LinkedHashMap.java:559)
    at org.apache.tinkerpop.gremlin.server.util.ServerGremlinExecutor.<init>(ServerGremlinExecutor.java:136)
    at org.apache.tinkerpop.gremlin.server.GremlinServer.<init>(GremlinServer.java:122)
    at org.apache.tinkerpop.gremlin.server.GremlinServer.<init>(GremlinServer.java:86)
    at org.apache.tinkerpop.gremlin.server.GremlinServer.main(GremlinServer.java:345)
Caused by: java.lang.IllegalArgumentException: gremlin-python is not an available GremlinScriptEngine
    at org.apache.tinkerpop.gremlin.jsr223.CachedGremlinScriptEngineManager.registerLookUpInfo(CachedGremlinScriptEngineManager.java:95)
    at org.apache.tinkerpop.gremlin.jsr223.CachedGremlinScriptEngineManager.getEngineByName(CachedGremlinScriptEngineManager.java:58)
    at org.apache.tinkerpop.gremlin.groovy.engine.GremlinExecutor.lambda$eval[=15=](GremlinExecutor.java:266)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

提到应该安装服务器插件。我原以为

$gspath/bin/gremlin-server.sh install org.apache.tinkerpop gremlin-python 3.4.3

会这样做,当我再次 运行 时,我得到:

Installing dependency org.apache.tinkerpop gremlin-python 3.4.3
Could not install the dependency: a module with the name gremlin-python is already installed

如何从这里开始工作?

我将python测试代码缩减为:

# https://pypi.org/project/gremlinpython/

# start GremlinServer
# bin/gremlin-server.sh -i org.apache.tinkerpop gremlin-python 3.2.2-SNAPSHOT
# bin/gremlin-server.sh conf/gremlin-server-modern-py.yaml

# in practice, you really only need the 3 imports below

from gremlin_python import statics
from gremlin_python.structure.graph import Graph
from gremlin_python.driver.driver_remote_connection import DriverRemoteConnection
# this allows us to do g.V().repeat(out()) instead of g.V().repeat(__.out())-type traversals

#statics.load_statics(globals())

# create a remote connection using RemoteStrategy

graph = Graph()
g = graph.traversal().withRemote(DriverRemoteConnection('ws://localhost:8182','g'))

print (g.V().count().value())

我认为您只是抓住了代码、脚本和答案的点点滴滴,它们在 TinkerPop 多年发展过程中的各种版本方面不匹配。

我认为您只需要重新开始并简化即可。

  1. 选择必须最近发布的版本 3.4.3 和 download Gremlin 服务器。
  2. 解压缩并启动服务器:bin/gremlin-server.sh conf/gremlin-server-modern.yaml,最初尝试从 "localhost" 连接,这样就不需要更改配置并保持简单。
  3. 验证您可以使用 Gremlin Console 连接到它。
  4. 现在安装 gremlinpython,pip 确保使用 3.4.3。

此时我希望以下代码可以开箱即用:

g=traversal().withRemote(DriverRemoteConnection('ws://localhost:8182/gremlin','g'))
print (g.V().count().toList())

请注意,我用 toList() 终止了遍历(我注意到您的代码没有这样的 terminating step) - without that step the traversal will not be executed。我不确定这是否是您面临的问题的一部分。

至于这个命令:

bin/gremlin-server.sh install org.apache.tinkerpop gremlin-python 3.4.3

如果您打算将本机 python lambda 表达式发送到服务器,您只需要 运行。虽然这听起来不错,但请记住,您应该尽可能避免使用 lambda,而且 python ScriptEngine 在缓存和执行方面不如 Groovy 那样健壮。如果你绝对必须使用 lambda,我更喜欢 Groovy,即使你在 Python 中编码。也就是说,我不确定为什么您在服务器启动时遇到错误(事实上,我实际上使用 conf/gremlin-server-modern-py.yaml 测试了简单启动并且它启动时没有错误)。也许如果您使用全新的设置重试,您将获得一个干净的开始。

建立基本配置后,您可以进行调整,例如更改 Gremlin 服务器 yaml 文件中的 host 配置,以便您可以从外部 IP 地址连接到它。

基于@stephen mallette 的努力,我创建了:

https://github.com/WolfgangFahl/gremlin-python-tutorial

中有详细说明

http://wiki.bitplan.com/index.php/Gremlin_python

有可用的基于脚本的安装:

./run -h
usage: ./run  [-h|-i|-s|-c]
  -h|--help: show this usage
  -i|--install: install prerequisites
  -s|--server: start server
  -c|--console: start console
  -p|--python: start python trial code

它尝试自动执行必要的步骤

  1. 安装
  2. Gremlin-Server开始
  3. Gremlin-Console 开始(用于调试)
  4. Python 脚本开始

1.安装

 run -i

安装

  1. gremlin 服务器
  2. gremlin 控制台
  3. gremlin python 模块

2。 Gremlin-Server开始

 ./run -s

在前台使用默认 yaml-file 启动 gremlin 服务器

3。 Gremlin-Console开始(用于调试)

 ./run -c

启动 gremlin 控制台

4. Python 脚本开始

./run -p

启动 python 测试脚本。

# minimal imports
from gremlin_python.process.anonymous_traversal import traversal
from gremlin_python.driver.driver_remote_connection import DriverRemoteConnection
# get the remote graph traversal
g = traversal().withRemote(DriverRemoteConnection('ws://localhost:8182/gremlin','g'))
vCount=g.V().count().next()
print("The modern graph has %d vertices" % (vCount))

预期结果:

starting python test code
The modern graph has 6 vertices

以上脚本已通过以下测试:

  • Ubuntu 18.04 LTS
  • 特拉维斯
  • MacOS 和 MacPorts

我怀疑您已经有解决此问题的方法 - 但我认为 599 是因为您无法通过本地计算机设置以外的任何其他方式访问 ws 端口。我在隔离安装时遇到了类似的问题。

如果您将 gremlin yaml 中的主机 属性 设置为 0.0.0.0 - 它将监听所有接口。在 localhost 上测试所有内容给了我一种错误的安全感 - 当我监听所有网络接口时有效 - 这反过来又允许我有单独的客户端到 gremlin 服务器。