如何从gremlin返回子图,它是一种易于使用的Java格式

当我尝试进行单次遍历并使用Gremlin立即从DSE Graph 5.0中获取大量内容时,我对非常简单的事情感到非常沮丧。

在我的简化案例中,我有:

  • 1个具有特定uuid的实体
  • 实体可以为零(参见可选)或更多类型
  • 我需要能够返回entitytypes

到目前为止,我的工作非常难看:(

 List list = gV().hasLabel("Entity").has("uuid","6708ec6d-4518-4159-9005-9e9d642f157e").as("entity") .optional(outE("IsOfType").as("types")) .select("entity", "types").toList(); List typeEdges = new ArrayList(); Vertex entityV = null; for (Object obj : list) { entityV = ((Vertex)((LinkedHashMap) obj).get("entity")); Edge typeEdge = ((Edge)((LinkedHashMap) obj).get("types")); typeEdges.add(typeEdge); } 

列表中的每一行都有实体和其中一种类型:/

我正在做这一切,因为Vertex没有基于DSE 5.0 Fluent API中的遍历填充edges() 。 所以要么我被困在多个遍历或一个巨大的可怕遍历,这在Java对象中非常难以反序列化,或者我必须将gremlin查询作为String传递但不会返回Gremlin Vertex对象而是DSE而是:(

在我不那么简化的情况下,我想要返回上面的多个实体及其各自的类型,如何做到这一点?

最后,什么是一个好的方法,将导致可重用的代码自定义对象映射具有不同类型的对象的子图?

提前谢谢你的帮助!

如果Entity:Type1:n关系,那么你甚至不需要optional()

 gV().has("Entity","uuid","6708ec6d-4518-4159-9005-9e9d642f157e"). project("entity","types").by().by(outE("IsOfType").fold()) 

结果将是List>

UPDATE

在下面的注释中进行简短的toList()讨论之后,这就是如何处理遍历结果而不将整个事物存储在集合中:

 gV().has("Entity","uuid","6708ec6d-4518-4159-9005-9e9d642f157e") .project("entity","types").by().by(outE("IsOfType").fold()) .forEachRemaining(m -> { final Vertex entityV = (Vertex) m.get("entity"); final List typeE = (List) m.get("types"); // whatever ... })