0

当我尝试使用 Gremlin 进行一次遍历并一次从 DSE Graph 5.0 带来很多东西时,我对非常简单的事情感到非常沮丧。

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

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

到目前为止,我所拥有的东西非常丑陋:(

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 查询作为字符串传递,但不会返回 Gremlin Vertex 对象,而是返回 DSE :(

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

最后,有什么好的方法可以为具有不同类型对象的子图的自定义对象映射生成可重用代码?

预先感谢您的帮助!

4

1 回答 1

1

如果Entity:Type1: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 ...
        })
于 2016-12-23T18:41:04.893 回答