我有一个FramedGraph对象,其中包含不同类的顶点,例如Person和Location。我想检索“Person”类的所有顶点。这是我目前的方法。
public List<Person> listPeople() {
List<Person> people = new ArrayList<Person>();
Iterator iterator = g.getVertices().iterator();
while (iterator.hasNext()) {
Vertex v = (Vertex) iterator.next();
Person p = (Person) g.getVertex(v.getId(), Person.class);
people.add(p);
}
return people;
}
这感觉非常低效,因为我循环遍历所有顶点,然后一次退回一个顶点。我研究了使用Gremlin语法,但我没有看到如何通过Frames类进行限制。有更高效的检索方法吗?感谢..
答案 0 :(得分:1)
据我所知,Tinkerpop Frame框架充当顶点周围的包装类。顶点实际上并不存储为接口类。因此,我们需要一种方法来将顶点标识为特定type
。
我的解决方案,我在框架类中添加了@TypeField
和@TypeValue
注释。然后我使用这些值来查询FramedGraph
。
可以在此处找到这些注释的文档:https://github.com/tinkerpop/frames/wiki/Typed-Graph
@TypeField("type")
@TypeValue("person")
interface Person extends VertexFrame { /* ... */ }
然后通过添加FramedGraphFactory
来定义TypedGraphModuleBuilder
。
static final FramedGraphFactory FACTORY = new FramedGraphFactory(
new TypedGraphModuleBuilder()
.withClass(Person.class)
//add any more classes that use the above annotations.
.build()
);
然后检索Person
Iterable<Person> people = framedGraph.getVertices('type', 'person', Person.class);
我不确定这是最有效/简洁的解决方案(我想看看@stephen mallette的建议)。目前还没有,但能够做到这样的事情是合乎逻辑的:
// framedGraph.getVertices(Person.class)
这个问题看起来像这个问题一样(看起来像你是第一个) - Tinkerpop Frames: Query vertices based on interface type。