【问题标题】:OrientDB getVertices not working with Java-generated class/indexOrientDB getVertices 不适用于 Java 生成的类/索引
【发布时间】: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 确认)。
  • 我能够重现您所说的内容。看起来是个问题。

标签: java indexing orientdb


【解决方案1】:

我在 OrientDB 存储库上为此创建了一个问题 (#3889)。已修复。

【讨论】:

    猜你喜欢
    • 2020-02-06
    • 2012-08-30
    • 1970-01-01
    • 2020-04-13
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    相关资源
    最近更新 更多