Как найти вершины определенного класса с фреймами 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: запрос вершин на основе типа интерфейса.