Java 如何使用OCommandGremlin直接查询顶点属性?
我想直接使用OCommandGremlin查询顶点和边属性。我有几个不同的用例,但为了解释这个问题,这里有一个简单的场景 场景:查找所有直接连接的ID。 方法1:查询顶点,然后查找ID 这是我的示例工作代码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";
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;