Как найти вершины определенного класса с помощью Tinkerpop Frames

У меня есть объект FramedGraph с вершинами разных классов, например Person и Location. Я хотел бы получить все вершины класса «Человек». Вот мой текущий метод.

    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. Есть ли более эффективный метод извлечения? Спасибо..


person Brian Dolan    schedule 14.04.2015    source источник


Ответы (1)


Насколько я понимаю, фреймворк Tinkerpop Frame действует как класс-обертка вокруг вершины. Вершина на самом деле не хранится как интерфейсный класс. Таким образом, нам нужен способ идентифицировать вершину как принадлежащую конкретному type.

В моем решении я добавил аннотации @TypeField и @TypeValue к своим классам Frame. Затем я использую эти значения для запроса моего 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: запрос вершин на основе типа интерфейса.

person Nick Grealy    schedule 15.04.2015
comment
Это выглядит многообещающе. Я также хотел бы знать, что говорит Стивен Маллет, но я думаю, что вы правы. - person Brian Dolan; 15.04.2015
comment
Спасибо за ответ и спасибо Брайану. Я добавляю некоторые подробности к вашему ответу для будущих посетителей и должен удалить свой вопрос позже. - person Mohamed Taher Alrefaie; 16.04.2015
comment
@ M-T-A, спасибо за редактирование, я пропустил это. Я не знаю, почему ваше изменение было отклонено, но я добавил его вручную. - person Nick Grealy; 17.04.2015