如何 return 来自 gremlin 的子图,它是 Java 的一种易于使用的格式
how to return subgraph from gremlin that is in an easily consumable format for Java
当我尝试进行一次遍历并使用 Gremlin 一次从 DSE Graph 5.0 带来很多东西时,我对非常简单的事情感到非常沮丧..
在我的简化案例中,我有:
- 1 个具有特定 uuid 的实体
- 实体可以有零个(见可选)或更多类型
- 我需要能够 return
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 查询作为字符串传递,但这不会 return Gremlin Vertex 对象而是 DSE相反:(
在我不太简化的情况下,我想 return 上面的多个实体及其各自的类型如何做到这一点?
最后,什么是一种好方法,可以为具有不同类型对象的子图的自定义对象映射生成可重用代码?
提前感谢您的帮助!
如果 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 一次从 DSE Graph 5.0 带来很多东西时,我对非常简单的事情感到非常沮丧..
在我的简化案例中,我有:
- 1 个具有特定 uuid 的实体
- 实体可以有零个(见可选)或更多类型
- 我需要能够 return
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 查询作为字符串传递,但这不会 return Gremlin Vertex 对象而是 DSE相反:(
在我不太简化的情况下,我想 return 上面的多个实体及其各自的类型如何做到这一点?
最后,什么是一种好方法,可以为具有不同类型对象的子图的自定义对象映射生成可重用代码?
提前感谢您的帮助!
如果 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 ...
})