OrientDB getVertices 不适用于 Java 生成的 class/index
OrientDB getVertices not working with Java-generated class/index
总结
我正在使用 OrientDB 进行概念验证,但我在查询通过 Java API.[=20 生成的 class/composite 索引时遇到了一些问题=]
我创建了 class,添加了一些属性并使用 API 生成了复合索引,然后添加了一条示例记录。我使用 Studio 验证一切正常。然后我使用 getVertices(String label, String[] keys, Object[] values)
尝试拉取我的样本记录,但没有得到任何结果。
我清除了索引和 class 并使用 Studio UI 重新创建了它们,运行 getVertices 代码和记录已成功检索。
在调查过程中,我还使用 Java API 重新创建了 class/index 并提供了不正确的标签(通过 [= 创建的 class 70=] 扩展了V) 并且记录被成功检索,这很奇怪。
为什么 Java 创建的 class/index 与我在 UI 中创建的行为不同?我做错了什么吗?
环境背景
我正在使用 OrientDB Enterprise 2.0.3 和 2.0.x orientdb-* 和 blueprints-core 罐子。
详情
我正在 Java 中创建 class/index 有点像这样(为简单起见缩短,更改字符串以保护无辜者):
//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 中(select * 来自 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 中创建的 运行dom class,它扩展了 V 并且具有与 MyClass 完全不同的属性,我得到了结果。这种情况让我有点害怕,因为最终可能会有多个 class 具有相同的属性,我必须能够从特定的 class 中查询带有 属性 集的记录 -我不想从一堆不同的 classes...
中提取结果
如果我从 Studio UI 和 运行 graph.getVertices("MyClass",keys,values)
重新创建 MyClass,我会得到预期的结果。
我在 OrientDB 存储库上为此创建了一个问题 (#3889)。已修复。
总结
我正在使用 OrientDB 进行概念验证,但我在查询通过 Java API.[=20 生成的 class/composite 索引时遇到了一些问题=]
我创建了 class,添加了一些属性并使用 API 生成了复合索引,然后添加了一条示例记录。我使用 Studio 验证一切正常。然后我使用 getVertices(String label, String[] keys, Object[] values)
尝试拉取我的样本记录,但没有得到任何结果。
我清除了索引和 class 并使用 Studio UI 重新创建了它们,运行 getVertices 代码和记录已成功检索。
在调查过程中,我还使用 Java API 重新创建了 class/index 并提供了不正确的标签(通过 [= 创建的 class 70=] 扩展了V) 并且记录被成功检索,这很奇怪。
为什么 Java 创建的 class/index 与我在 UI 中创建的行为不同?我做错了什么吗?
环境背景
我正在使用 OrientDB Enterprise 2.0.3 和 2.0.x orientdb-* 和 blueprints-core 罐子。
详情
我正在 Java 中创建 class/index 有点像这样(为简单起见缩短,更改字符串以保护无辜者):
//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 中(select * 来自 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 中创建的 运行dom class,它扩展了 V 并且具有与 MyClass 完全不同的属性,我得到了结果。这种情况让我有点害怕,因为最终可能会有多个 class 具有相同的属性,我必须能够从特定的 class 中查询带有 属性 集的记录 -我不想从一堆不同的 classes...
如果我从 Studio UI 和 运行 graph.getVertices("MyClass",keys,values)
重新创建 MyClass,我会得到预期的结果。
我在 OrientDB 存储库上为此创建了一个问题 (#3889)。已修复。