2016-01-20 70 views
0

我想直接使用OCommandGremlin來查詢頂點和邊的屬性。我有幾個不同的用例,但爲了解釋這個問題,這裏是一個簡單的場景。如何使用OCommandGremlin直接查詢頂點屬性?

場景:查找所有直接連接的ID。

方法1:查詢頂點,然後找到ID。

這工作,這裏是我的示例工作代碼。

public void printConnections(Long personId) { 

    Object vertexId = getNode(PERSON, personId).getId(); 

    String oSql = "g.v(vId).both.dedup"; 

    Map<String, Object> params = new HashMap<String, Object>(); 
    params.put("vId", vertexId); 

    OrientDynaElementIterable result = getGraph() 
      .command(new OCommandGremlin(oSql)).execute(params); 

    Iterator<Object> iterator = result.iterator(); 

    while (iterator.hasNext()) { 
     OrientVertex v = (OrientVertex) iterator.next(); 
     Long idx = v.getProperty("idx"); 
     System.out.println(idx); 
    } 
} 

方法2:直接ID查詢。

代碼:

public void printConnections2(Long personId) { 

    Object vertexId = getNode(PERSON, personId).getId(); 

    String oSql = "g.v(vId).both.dedup.idx"; 

    Map<String, Object> params = new HashMap<String, Object>(); 
    params.put("vId", vertexId); 

    OrientDynaElementIterable result = getGraph() 
      .command(new OCommandGremlin(oSql)).execute(params); 

    Iterator<Object> iterator = result.iterator(); 

    while (iterator.hasNext()) { 
     Object obj = iterator.next(); // Exception here. 
     System.out.println(obj); 
    } 
} 

令人驚訝的林在iterator.next得到NoSuchElementException異常()調用。

java.util.NoSuchElementException在com.tinkerpop.blueprints.impls.orient.OrientDynaElementIterator.next(OrientDynaElementIterator.java:57) ...更多呼叫跟蹤...

迭代器指向該ArrayList只有空值。可能這就是NoSuchElementException的原因。 OCommandGremlin Response for prop query

任何想法?

+0

我有你同樣的問題,如果我會解決問題,我會讓你知道 –

+0

我做了一些調試,並找出了爲什麼林得到例外。 – Vineeth

回答

0

我做了一些調試,發現爲什麼我得到異常。

當響應是一個列表時,在com.orientechnologies.orient.client.remote.OStorageRemote.readSynchResult(…)方法中變量type的值是108(即'1')。因此,變量coll使用ArrayList進行初始化,並重復執行tot次數來獲取並設置列表中的數據(如預期的那樣)。

取數據使用OChannelBinaryProtocol.readIdentifiable(network)方法。在OChannelBinaryProtocol.readIdentifiable(network)中,首先獲取每個項目的classId。對於正常頂點,classId的值爲0,但對於像LongString這樣的正常對象,其-2等於RECORD_NULL。所以它返回null,我們得到一個空值列表作爲最終響應。

相關代碼片段:

OStorageRemote.readSynchResult(…)片段

case 'l': 
case 's': 
    final int tot = network.readInt(); 
    final Collection<OIdentifiable> coll; 

    coll = type == 's' ? new HashSet<OIdentifiable>(tot) : new ArrayList<OIdentifiable>(tot); 
    for (int i = 0; i < tot; ++i) { 
    final OIdentifiable resultItem = OChannelBinaryProtocol.readIdentifiable(network); 
    if (resultItem instanceof ORecord) 
     database.getLocalCache().updateRecord((ORecord) resultItem); 
    coll.add(resultItem); 
    } 

    result = coll; 
    break; 

OChannelBinaryProtocol.readIdentifiable(network)片段

public static OIdentifiable readIdentifiable(final OChannelBinaryAsynchClient network) throws IOException { 
    final int classId = network.readShort(); 
    if (classId == RECORD_NULL) 
     return null; 

看起來像一個錯誤或不支持的功能。

注意:如果只有一個節點與查詢"g.v(vId).both.dedup.idx"匹配,則結果是idx的值不是大小爲1的列表。

+0

已創建https://github.com/orientechnologies/orientdb/issues/5616 – Vineeth

相關問題