如何从gremlin返回子图,它是一种易于使用的Java格式
当我尝试进行单次遍历并使用Gremlin立即从DSE Graph 5.0中获取大量内容时,我对非常简单的事情感到非常沮丧。
在我的简化案例中,我有:
- 1个具有特定uuid的实体
- 实体可以为零(参见可选)或更多类型
- 我需要能够返回
entity
和types
到目前为止,我的工作非常难看:(
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:Type
是1: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 ... })