Java环境下如何打印Apache TinkerPop 3.3查询结果?
解决Apache TinkerPop 3.3中查询结果无法正确打印的问题
我之前在TinkerPop 3.3里踩过一模一样的坑!你碰到的问题核心是TinkerPop的遍历是惰性求值的——直接打印GraphTraversal对象,输出的只是遍历的步骤描述(比如你看到的[GraphStep(vertex,[v[0]]), VertexStep(IN,vertex)]),而不会触发实际的查询执行,自然看不到真实结果。
正确的解决步骤
要拿到并打印实际结果,你需要确保触发遍历的执行,同时正确处理返回值:
1. 直接获取结果列表(最常用)
如果你想拿到与V1关联的顶点的属性值列表,调用toList()触发执行,并打印它的返回值,而不是打印遍历对象本身:
GraphTraversalSource g = tg.traversal(); // 触发遍历执行,获取所有结果 List<Object> relatedValues = g.V(V1).in().values().toList(); // 打印真实结果 System.out.println(relatedValues);
如果你的需求是获取关联的顶点对象(而非属性值),去掉values()即可:
List<Vertex> relatedVertices = g.V(V1).in().toList(); System.out.println(relatedVertices);
2. 处理fold()的特殊情况
你代码里用到了fold(),它是一个归约操作,会把所有结果打包成一个单一的List返回。这时候你需要用next()来获取这个归约后的结果(因为fold()返回的遍历只包含一个元素):
Object foldedResults = g.V(V1).in().values().fold().next(); System.out.println(foldedResults);
3. 为什么你加toList()无效?
大概率是写法问题——比如你可能只是给遍历加了toList(),但没有打印toList()的返回值,反而还是打印了原来的遍历对象。比如错误写法:
// 错误:只是调用了toList(),但没打印它的返回值 g.V(V1).in().values().fold().toList(); System.out.println(g.V(V1).in().values().fold()); // 还是打印遍历步骤
一定要把toList()的返回值存起来或者直接打印。
补充说明
TinkerPop里的终止操作(比如toList()、next()、iterate())才会触发遍历的实际执行:
toList():返回所有结果的Listnext():返回第一个结果(如果遍历为空会抛异常)iterate():只执行遍历,不返回任何结果(适合更新操作)
内容的提问来源于stack exchange,提问作者E.Brum
相关产品推荐
相关产品推荐

