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

Java 如何使用OCommandGremlin直接查询顶点属性?,java,orientdb,Java,Orientdb,我想直接使用OCommandGremlin查询顶点和边属性。我有几个不同的用例,但为了解释这个问题,这里有一个简单的场景 场景:查找所有直接连接的ID。 方法1:查询顶点,然后查找ID 这是我的示例工作代码 public void printConnections(Long personId) { Object vertexId = getNode(PERSON, personId).getId(); String oSql = "g.v(vId).both.dedup";

我想直接使用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);
    }
}
public void打印连接(长personId){
Object vertexId=getNode(PERSON,personId).getId();
String oSql=“g.v(vId).both.dedup”;
Map params=新的HashMap();
参数put(“vId”,vertexId);
OrientDynaElementIterable结果=getGraph()
.command(新的OCommandGremlin(oSql)).execute(params);
迭代器迭代器=result.Iterator();
while(iterator.hasNext()){
OrientVertex v=(OrientVertex)迭代器.next();
Long idx=v.getProperty(“idx”);
System.out.println(idx);
}
}
方法2:直接查询ID

代码:

public void打印连接2(长人名){
Object vertexId=getNode(PERSON,personId).getId();
String oSql=“g.v(vId).both.dedup.idx”;
Map params=新的HashMap();
参数put(“vId”,vertexId);
OrientDynaElementIterable结果=getGraph()
.command(新的OCommandGremlin(oSql)).execute(params);
迭代器迭代器=result.Iterator();
while(iterator.hasNext()){
Object obj=iterator.next();//此处出现异常。
系统输出打印项次(obj);
}
}
令人惊讶的是,我在iterator.next()调用中没有得到任何TouchElementException

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

迭代器指向的arraylist只有空值。也许这就是无接触例外的原因。


有什么想法吗?

我做了一些调试,并找出了为什么我会出现异常

当响应是列表时,
com.orientechnologies.orient.client.remote.ostrageremote.readSynchResult(…)
方法中变量
type
的值为108(即“l”)。因此,变量
coll
用ArrayList初始化,并迭代
tot
获取和设置列表中的数据的次数(如预期)

要获取数据,请使用OChannelBinaryProtocol.ReadIdentification(网络)方法。在
OChannelBinaryProtocol.readIdentification(网络)
中,首先获取每个项目的classId。对于法线顶点,classId的值为0,但对于法线对象,如
Long
String
its-2,它等于
RECORD\u NULL
。所以它返回null,我们得到一个null列表作为最终响应

相关代码片段:

OStorageRemote.readSynchResult(…)
snippet

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;
  public static OIdentifiable readIdentifiable(final OChannelBinaryAsynchClient network) throws IOException {
    final int classId = network.readShort();
    if (classId == RECORD_NULL)
      return null;
看起来像是一个bug或不受支持的功能。


注意:如果只有一个节点匹配查询
“g.v(vId).both.dedup.idx”
,那么结果就是idx的值,而不是一个大小为1的列表。

我也有同样的问题,如果我能解决这个问题,我会让你知道我做了一些调试,并找出了为什么我会出现异常。
  public static OIdentifiable readIdentifiable(final OChannelBinaryAsynchClient network) throws IOException {
    final int classId = network.readShort();
    if (classId == RECORD_NULL)
      return null;