为何gremlin.sh中V().count()返回0,Java代码中却非0?
问题解答
一、为什么bin/gremlin.sh中V().count()返回0?
核心原因是你在Gremlin控制台连接远程服务器后,仍在操作本地默认的TinkerGraph(内存空图),而非远程的JanusGraph。
具体细节:
- 执行
:remote connect tinkerpop.server conf/remote.yaml仅建立了和远程Gremlin Server的连接,但控制台默认仍以本地内存图作为遍历源; - 直接输入
V().count()时,查询的是本地空的TinkerGraph,自然返回0; - 你的Java代码通过
traversal().withRemote()直接绑定到远程的g遍历源,所有操作都在远程JanusGraph上执行,因此能正确查询到添加的顶点。
解决方案
任选以下一种方式即可:
- 切换到远程全局模式:连接远程后执行
:remote console,之后所有查询都会自动发送到远程服务器:gremlin> :remote connect tinkerpop.server conf/remote.yaml ==>Configured localhost/127.0.0.1:8182 gremlin> :remote console ==>All scripts will now be sent to Gremlin Server - [localhost/127.0.0.1:8182] - type ':remote console' to return to local mode gremlin> V().count() ==>2 - 指定远程遍历源:每次查询时使用远程配置的遍历源名称
g(对应Java配置中的sourceName=g):gremlin> :remote connect tinkerpop.server conf/remote.yaml ==>Configured localhost/127.0.0.1:8182 gremlin> g.V().count() ==>2 - 单条查询前缀标记:在查询前加
>前缀,强制该条查询发送到远程:gremlin> :remote connect tinkerpop.server conf/remote.yaml ==>Configured localhost/127.0.0.1:8182 gremlin> > V().count() ==>2
二、Java项目和Gremlin控制台执行查询的区别
- 执行环境与遍历源默认值
- Java项目:通过
DriverRemoteConnection直接绑定到远程Gremlin Server的指定遍历源(如g),所有操作默认在远程图数据库上执行; - Gremlin控制台:默认启动后使用本地内存图(TinkerGraph),需手动配置并切换到远程模式才能操作远程图。
- Java项目:通过
- 操作方式
- Java项目:以编程方式封装Gremlin遍历,通过Driver发送请求到Server,适合自动化、批量操作;
- 控制台:交互式执行单条或批量脚本,适合调试、快速验证查询逻辑。
- 数据持久化
- Java项目操作的是远程JanusGraph,数据持久化到后端存储(如默认的BerkeleyDB);
- 控制台本地模式的TinkerGraph数据仅存于内存,关闭控制台即丢失。
内容的提问来源于stack exchange,提问作者Zach
相关产品推荐
相关产品推荐

