我想直接使用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
任何想法?
答案 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,但对于像Long
或String
这样的普通对象,其-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的列表。