2014-12-02 3 views
4

У меня возникли проблемы с графическим API OrientDB в Java.Извлечение объектов OrientVertex из OrientDB

Проблема:

Получение Vertices (? OrientVertex или Vertex) из постоянной локальной базе данных графа с несколькими вершинами/Кромки создана с помощью консоли.

Так, я был в состоянии запросить базу данных от того, что я теперь думаю, что это API документов с использованием

graph = factory.getTx(); 
String string = String.format("select * from V where name like \"%s\"", criteria); 
OSQLSynchQuery<ODocument> query = new OSQLSynchQuery<OrientVertex>(string); 
List<OrientDocument> results = graph.getRawGraph().command(query).execute(); 

Но это не будет работать для Вершины. Как выполнить запросы, возвращающие список вершин в моей базе данных?

Заранее спасибо.

+0

В частности, документация очень хороша в отношении того, как писать запросы, но не так ясно, как на самом деле ** использовать ** запросы. –

ответ

3

Рассматривая свой код, вы используете Graph API. После звонка getRawGraph() вы не являетесь , а не, работая с API-интерфейсом Graph больше, но с API-интерфейсом документа (имя метода немного запутывает).

Имея ссылку на OrientGraph есть несколько возможностей

  • Использование orientGraph#getVertex*(..)/orientGraph#getVertices*(..) стиль методов
  • Использование объекта запроса: orientGraph#query().has("key", value).vertices()
  • Использование языка gremlin запросов
  • Использование orientGraph#command(...).execute(). В этом случае команда будет выполнена вне сделки (спасибо @ wolf4ood)
+0

Кажется, что 'getVertex' и' getVertices' возвращают типы данных типа «Вершина» Blueprint, а не 'OrientVertex', что означает, что я теряю некоторые преимущества« OrientVertex ». Я попробую объект запроса и отчитаюсь. Спасибо за помощь. –

+0

'graph.query(). Has (" name ").vertices() ', похоже, возвращает' Iterable '. Не существует способа получить объекты OrientVertex из базы данных? –

+0

Их можно просто направить на «OrientVertex». Они возвращают 'Vertex', потому что некоторые методы реализуют API Blueprints. Другие методы (с надписью «Расширение Blueprints») возвращают OrientVertex. Взгляните на документ API. Таким образом, реализация ** - это 'OrientVertex' во всех случаях! – rmuller

5

Вы можете избежать получения rawGraph и казнили команду непосредственно с orientGraph и возвращает итератор из OrientVertex

так:

graph = factory.getTx(); 
String query = String.format("select * from V where name like \"%s\"", criteria); 
OSQLSynchQuery<OrientVertex> qr = new OSQLSynchQuery<OrientVertex>(query); 
Iterable<OrientVertex> vertices = graph.command(qr).execute(); 
+0

Обратите внимание, что при использовании команды 'orientGraph # (...)' команда выполняется ** вне ** транзакции. – rmuller

+0

Это было бы лучше, но выполнение за пределами транзакции не похоже на хорошую вещь. Есть ли экземпляр, в котором i ** должен использовать этот метод **? Разве это не нарушает принципы ACID? Я все еще могу написать SQL-запрос и использовать подстановочные знаки с помощью этого метода. –

0

Иногда мы хотим получить Вершины специально на основе других свойств, как имена, возраст и т.д. так, я использовал getVertices() метод, чтобы получить итератор, а затем извлекали вершину, так как getVertexByKey() осуждается now.The код: Vertex v2=graph.getVertices("name","Business").iterator().next();

Так что мы просто получил вершину, не зная RID записи. Я не знаю, является ли это лучшим методом для этого, но он выполняет эту работу.