问题描述
如何从本地gremlin-console将graphml文件加载到Janusgraph的远程实例中
最终,我想在远程VM上创建JanusGraph,但为此PoT,我使用以下命令创建了本地docker映像
docker run --rm --name janusgraph-default janusgraph/janusgraph:latest
哪个工作正常。然后,我使用以下命令启动gremlin-console:
docker run --rm --link janusgraph-default:janusgraph -e GREMLIN_REMOTE_HOSTS=janusgraph \ -it janusgraph/janusgraph:latest ./bin/gremlin.sh
这也可以。我在格莱姆林控制台上跑了
:remote connect tinkerpop.server conf/remote.yaml
然后
:> g.addV('person').property('name','chris')
为了测试它是否有效,我跑了
:> g.V().values('name')
返回了chris
(我认为)证明了gremlin-console可以控制docker映像中的gremlin-server,我想导入K LaWrence的air-routes-latest.graphml
,以尝试在Node.js中创建一些CRUD操作
我能找到的所有文档仅处理本地导入,而不处理远程
我尝试过:
:> graph.io(graphml()).readGraph("/home/me/Downloads/air-routes.graphml")
,返回了
/home/me/Downloads/air-routes.graphml (No such file or directory)
堆栈跟踪:
display stack trace? [yN]y
java.io.FileNotFoundException: /home/greg/Downloads/air-routes.graphml (No such file or directory)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:195)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at java.io.FileInputStream.<init>(FileInputStream.java:93)
at org.apache.tinkerpop.gremlin.structure.io.graphml.GraphMLIo.readGraph(GraphMLIo.java:91)
at org.apache.tinkerpop.gremlin.structure.io.Io$readGraph.call(UnkNown Source)
at Script5.run(Script5.groovy:1)
at org.apache.tinkerpop.gremlin.groovy.jsr223.GremlinGroovyScriptEngine.eval(GremlinGroovyScriptEngine.java:674)
at org.apache.tinkerpop.gremlin.groovy.jsr223.GremlinGroovyScriptEngine.eval(GremlinGroovyScriptEngine.java:376)
at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:233)
at org.apache.tinkerpop.gremlin.groovy.engine.GremlinExecutor.lambda$eval$0(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)
我有信心这就是它的真实位置(与控制台在同一台计算机上),但是这让我想知道导入是否具有远程服务器的上下文(在这种情况下为docker映像,但可能是远程VM)或本地控制台?我找不到任何帮助可以照亮该帮助吗?
Gremlin.version()
==>3.4.4
gremlin-console janusgraph tinkerpop gremlin
解决方法
目前,Gremlin io()
不能以此方式工作。在评估您的io()
步骤时,它将使用执行该文件的本地文件系统来执行其工作。在您的情况下,您有一个在同一系统上运行的docker容器,因此从技术上讲,您可以按照我的要求执行操作,但是我认为该Docker容器需要配置为以这种方式挂载/home/greg/Downloads/
它将可供使用。否则,Docker将被隔离到其自己的文件空间中。我认为您需要Docker volume
或bind
mount才能使其正常工作。
在斯蒂芬的回应之后,我尝试了以下有效的方法:
设置Janusgraph服务器以导入air-routes.graphml
bash终端1(su):
docker run --name janusgraph-default --volume /home/greg/Downloads/gremlin:/dataImports janusgraph/janusgraph:latest
((如有必要,请使用docker container stop <pid>
删除一个冲突的容器)
这会将本地文件夹/home/greg/Downloads/gremlin
安装为图像中的/dataImports
,因此可以导入air-routes.graphml文件(您需要从此链接下载并替换自己的本地文件下载路径)
这是一个有用的graphml数据集。仔细阅读here和here。
要运行导入,请打开一个新的bash终端2(su):
docker run --rm --link janusgraph-default:janusgraph -e GREMLIN_REMOTE_HOSTS=janusgraph -it janusgraph/janusgraph:latest ./bin/gremlin.sh
这将链接到janusgraph服务器(无需端口绑定)并打开gremlin-console。
在控制台上,运行:
:remote connect tinkerpop.server conf/remote.yaml
然后使用以下命令导入graphml文件
:> graph.io(graphml()).readGraph("/dataImports/air-routes.graphml")
它应该返回null。完成后,运行查询,如:
:> g.V().has('airport','code','DFW').values()