【发布时间】:2015-05-12 03:33:22
【问题描述】:
总结
我正在使用 OrientDB 进行概念验证,但在查询通过 Java API 生成的类/复合索引时遇到了一些问题。
我创建了类,添加了一些属性并使用 API 生成了复合索引,然后添加了示例记录。我使用 Studio 确认一切正常。然后我使用getVertices(String label, String[] keys, Object[] values) 尝试提取我的示例记录,但没有得到任何结果。
我清除了索引和类并使用 Studio UI 重新创建它们,运行 getVertices 代码并成功检索记录。
在调查过程中,我还使用 Java API 重新创建了类/索引,并提供了错误的标签(通过 UI 创建的扩展 V 的类),并且成功检索了记录,这很奇怪。
为什么 Java 创建的类/索引的行为与我在 UI 中创建的不同?我是不是做错了什么?
环境背景
我正在使用 OrientDB Enterprise 2.0.3 和 2.0.x orientdb-* 和 blueprints-core jars。
详情
我在 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),我会得到预期的结果。
【问题讨论】:
-
我刚刚下载了
2.0.6并运行了 gist.github.com/vitorenesduarte/1939661e4fd812ed90a7 这段与你的代码相同的代码,它可以工作。这很奇怪。 -
我运行了你的代码,它运行良好。然后,我逐步检查了我的代码,以确保我做了我认为我做的事情,并且无需修改即可正常运行。我不知道这次为什么会奏效。即使在您的示例中,DummyClass 问题仍然存在。尝试创建一个虚拟类,使用一组随机属性(我选择 STRING apple)扩展 V(在 Studio 中或通过 API),然后将 sn-p 中的第 38 行更改为
graph3.getVertices("DummyClass", keys, values);- 尽管事实如此,我还是得到了响应DummyClass 没有记录(通过select * from dummyclass确认)。 -
我能够重现您所说的内容。看起来是个问题。