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

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

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: запрос вершин на основе типа интерфейса.

Другие вопросы по тегам