我正在使用OrientDB进行概念验证,我在查询通过Java API生成的类/复合索引时遇到了一些麻烦。
我创建了类,添加了一些属性并使用API生成了复合索引,然后添加了一个示例记录。我确认使用Studio一切都很好看。然后我使用getVertices(String label, String[] keys, Object[] values)
来尝试拉取我的样本记录,但没有得到任何结果。
我清除索引和类并使用Studio UI重新创建它们,运行getVertices代码并成功检索记录。
在我的调查过程中,我还使用Java API重新创建了类/索引,并提供了一个不正确的标签(通过扩展V的UI创建的类)并且记录被成功检索,这很奇怪。
为什么Java创建的类/索引的行为与我在UI中创建的类不同?我做错了吗?
我正在使用OrientDB Enterprise 2.0.3和2.0.x orientdb- *和blueprints-core jar。
我正在用类似的Java创建类/索引(为简单起见缩短了,为了保护无辜而修改了字符串):
//graph is an OrientGraph
//Create a new class that extends V
OClass vt = graph.createVertexType("MyClass", "V");
String[] props = {"first", "second", "third"}; //Property names
for(String prop : props)
vt.createProperty(prop, OType.STRING);
//Create unique composite index using all properties
vt.createIndex("myClass.myIndex", OClass.INDEX_TYPE.UNIQUE, props);
graph.commit();
我在这个图表中添加了记录并确认它们出现在Studio中(从MyClass中选择*):
Vertex v = graph.addVertex("class:MyClass");
v.setProperty("first", "foo");
v.setProperty("second", "bar");
v.setProperty("third", "ed");
graph.commit();
要查询图表,我使用的是:
String[] keys = {"first", "second", "third"};
String[] values = {"foo", "bar", "ed"};
//Using getVertices to get records from a specific class with specified key values.
//There could be multiple classes with the same properties, so I have to be able
//to look for a set of properties within a specific class.
Iterable<Vertex> resultIterator = graph.getVertices("MyClass", keys, values);
for (Vertex v : resultIterator){
results.add(v); //Store result references for later use
}
另外,我确认graph.isUseClassForVertexLabel()
是真的。
当我运行graph.getVertices("MyClass",keys,values)
时,什么都没有回来。
如果我运行graph.getVertices("DummyClass",keys,values)
,其中DummyClass是在Studio中创建的随机类,它扩展了V并且具有与MyClass完全不同的属性,我得到了结果。这种情况让我很害怕,因为最终可能有多个具有相同属性的类,我必须能够使用属性集查询特定类的记录 - 我不想从一堆中提取结果不同的班级...
如果我从Studio UI重新创建MyClass并运行graph.getVertices("MyClass",keys,values)
,我会得到预期的结果。