【发布时间】:2017-05-09 08:05:03
【问题描述】:
当我尝试使用 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 没有根据 DSE 5.0 Fluent API 中的遍历来填充 edges()。因此,要么我陷入了多次遍历,要么是一个巨大的可怕遍历,在 Java 对象中很难反序列化,或者我必须将 gremlin 查询作为字符串传递,但不会返回 Gremlin Vertex 对象,而是返回 DSE :(
在我不太简化的情况下,我想返回上述多个实体及其各自的类型,如何做到这一点?
最后,有什么好的方法可以为具有不同类型对象的子图的自定义对象映射生成可重用代码?
提前感谢您的帮助!
【问题讨论】:
-
既然
typeEdges是List,我可以假设一个实体可以有多种类型吗? -
我知道这听起来像是吹毛求疵,但需要澄清一下:DSE 5.0 fluent API 不决定返回什么数据。这是决定行为的 TinkerPop 3 规范。
-
好点亚历克斯!尽管正如我们在 jira 上讨论的那样,根据传递的查询类型(流利或字符串),返回的对象类型是 Gremlin 和 DSE 的。加上来自 DSE 的事务处理(使用
next()、toList()等)而不是来自程序员的明确规定了特定的查询样式,因为在next()、toList()等之后,查询被发送到服务器并且edges()未被填充在 GremlinVertex对象和 GremlinEdge对象上没有填充inVertex()/outVertex()Vertex对象的属性 -
我相信这些是 DataStax 团队做出的决定,而不是 TP3 标准,考虑到事情是如何在内部实现的,行为是什么,关于会话、事务以及对象是否将返回未填充或用于示例将被懒惰地评估。当然 API 和返回类型是由 TP3 规范强加的。 TitanDB 采用了不同的方法(由于某些原因更糟,对其他人更好)并且实现了不同风格的 Gremlin,即使 API 相同
标签: java datastax-enterprise gremlin datastax-enterprise-graph