如何从gremlin返回子图,它是Java的易用格式
当我尝试进行一次遍历并使用Gremlin一次从DSE Graph 5.0中带来很多东西时,我对非常简单的事情感到非常沮丧。
在我简化的情况下,我有:
- 1个具有特定uuid的实体
- 实体可以具有零(请参阅可选)或更多类型
- 我需要能够返回
entity
和types
我到目前为止可以工作的非常丑陋:(
List list = g.V().hasLabel("Entity").has("uuid","6708ec6d-4518-4159-9005-9e9d642f157e").as("entity") .optional(outE("IsOfType").as("types"))
.select("entity", "types").toList();
List<Edge> 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并没有edges()
根据DSE 5.0 Fluent
API中的遍历进行填充。因此,要么我陷入多重遍历,要么陷入一个巨大的可怕遍历,这在Java对象中很难反序列化,或者我必须将gremlin查询作为String传递,但不会返回Gremlin
Vertex对象,而是返回DSE :(
在我不太简化的情况下,我想返回上面的多个实体及其各自的类型,该怎么做?
最后,有什么好的方法可以导致可重用的代码用于具有不同类型对象的子图的自定义对象映射?
预先感谢您的帮助!
回答:
如果Entity:Type
是1:n
恋爱关系,那么您甚至不需要optional()
。
g.V().has("Entity","uuid","6708ec6d-4518-4159-9005-9e9d642f157e"). project("entity","types").by().by(outE("IsOfType").fold())
结果将为类型List<Map<String, Object>>
。
在toList()
下面的注释中进行了简短的讨论之后,这是如何遍历结果而不将整个对象存储在集合中的方法:
g.V().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<Edge> typeE = (List<Edge>) m.get("types");
// whatever ...
})
以上是 如何从gremlin返回子图,它是Java的易用格式 的全部内容, 来源链接: utcz.com/qa/408540.html