如何使用OCommandGremlin直接查询顶点属性?

时间:2016-01-20 02:15:07

标签: java orientdb

我想直接使用OCommandGremlin查询顶点和边缘属性。我有几个不同的用例,但为了解释这个问题,这是一个简单的场景。

场景:查找所有直接连接的ID。

方法1 :查询顶点,然后查找ID。

这是有效的,这是我的示例工作代码。

>>> x = 1
>>> range(2, x-1, 1)
[]

方法2 :直接查询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);
    }
}

令人惊讶的是我在iterator.next()调用时得到了NoSuchElementException。

com.tinkerpop.blueprints.impls.orient.OrientDynaElementIterator.next(OrientDynaElementIterator.java:57)中的java.util.NoSuchElementException ...更多呼叫追踪...

迭代器指向的arraylist只有null值。可能这就是NoSuchElementException的原因。 OCommandGremlin Response for prop query

任何想法?

1 个答案:

答案 0 :(得分:0)

我做了一些调试,并弄清楚为什么我得到了例外。

当响应是列表时,type方法中变量com.orientechnologies.orient.client.remote.OStorageRemote.readSynchResult(…)的值为108(即&#39; l&#39;)。因此,使用ArrayList初始化变量coll并迭代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的列表。