2014-12-02 101 views
4

我在Java中使用OrientDB的Graph API時遇到了問題。從OrientDB檢索OrientVertex對象

問題:

檢索頂點(?OrientVertex或頂點)從持久本地圖形數據庫與多個頂點的邊通過控制檯創建/。

所以對,我已經能夠從我現在想查詢數據庫是使用

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(); 

文檔API但這不會爲頂點工作。 如何運行在我的數據庫中返回頂點列表的查詢?

在此先感謝。

+0

具體而言,該文檔對於如何編寫查詢非常有用,但對如何實際**使用查詢並不十分清楚。 – 2014-12-02 19:16:26

回答

3

看着你的代碼,你正在使用Graph API。在調用getRawGraph()之後,您不再是而是,它與Document API一起工作,但使用Document API(方法名稱有點混亂)。

有到OrientGraph參考有幾種可能性

  • 使用方法
  • 使用查詢對象orientGraph#getVertex*(..)/orientGraph#getVertices*(..)風格:orientGraph#query().has("key", value).vertices()
  • 使用gremlin查詢語言
  • 使用orientGraph#command(...).execute()。在這種情況下執行該命令交易(感謝@ wolf4ood)
+0

'getVertex'和'getVertices'似乎返回了Blueprint'Vertex'數據類型,而不是'OrientVertex',這意味着我失去了'OrientVertex'的一些優點。我將嘗試查詢對象並返回。感謝您的幫助。 – 2014-12-02 19:43:46

+0

'graph.query()。has(「name」)。頂點()​​'似乎返回'Iterable '。沒有辦法將OrientVertex對象從數據庫中取出嗎? – 2014-12-02 19:47:23

+0

將它們投射到'OrientVertex'上很簡單。他們返回'Vertex',因爲有些方法實現了Blueprints API。其他方法(標有「Blueprints Extension」)返回OrientVertex。看看API文檔。所以**實現**在所有情況下都是'OrientVertex'! – rmuller 2014-12-02 19:48:16

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#command(...)',該命令會在事務外執行**。 – rmuller 2014-12-03 09:46:25

+0

這樣做會更好,但在交易之外執行聽起來不是件好事。是否有一個我**應該使用這種方法的實例?這不會破壞ACID校長嗎?我仍然可以編寫SQL查詢並使用通配符。 – 2014-12-03 12:44:18

0

有時候,我們要檢索專門基於其他屬性,如,頂點年齡等等等等,我用getVertices()方法獲取迭代器,然後提取的頂點,因爲getVertexByKey()被棄用now.The代碼: Vertex v2=graph.getVertices("name","Business").iterator().next();

所以我們只是得知頂點而不知道記錄的RID。 我不知道這是否是最好的方法來做到這一點,但它的工作。