1

我有一个 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 类进行限制。有没有更有效的检索方法?谢谢..

4

1 回答 1

1

据我了解,Tinkerpop Frame 框架充当顶点周围的包装类。顶点实际上并未存储为接口类。因此,我们需要一种方法来将顶点识别为特定的type.

我的解决方案是在我的 Frame 类中添加@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

于 2015-04-15T00:40:37.087 回答