结合OrientDB中的其他属性查询embeddedlist
Query embeddedlist combined with other property in OrientDB
我试图在我的 Java 应用程序中查询 OrientDB 中的嵌入式列表,但是当我将它与另一个 属性 组合时,我很难查询 属性 .
例如,这有效(类别是字符串的嵌入式列表):
select from Book where categories = :category
然而,当我这样查询时:
select from Book where categories = :category and year = 1980
然后突然我的查询不再给出任何结果,而我的数据库中肯定有 1980 年的书籍属于该类别。实际上,我网站上的所有书籍或 1980 年以来的书籍(但稍后,我还会添加 1981 年和 1982 年等的书籍)。
两个字段都已编入索引(NONUNIQUE 索引)。作为测试,我删除了年份的索引,结果查询再次正常运行。现在我很困惑:)
我用这个简单的结构试过你的案例:
CREATE CLASS Books
CREATE PROPERTY Books.title STRING
CREATE PROPERTY Books.categories EMBEDDEDLIST STRING
CREATE PROPERTY Books.year INTEGER
CREATE INDEX Books.categories ON Books(categories) NOTUNIQUE
CREATE INDEX Books.year ON Books(year) NOTUNIQUE
INSERT INTO Books(title, categories, year) VALUES('BookA', ['Fantasy','Adventure'], 1980)
INSERT INTO Books(title, categories, year) VALUES('BookA', ['Fantasy'], 1985)
INSERT INTO Books(title, categories, year) VALUES('BookA', ['Horror','Adventure'], 1984)
INSERT INTO Books(title, categories, year) VALUES('BookA', ['Adventure'], 1980)
INSERT INTO Books(title, categories, year) VALUES('BookA', ['Historical'], 1981)
INSERT INTO Books(title, categories, year) VALUES('BookA', ['Thriller'], 1990)
这是 class Books
:
中的结果
SELECT FROM Books
----+-----+------+-----+----------+----
# |@RID |@CLASS|title|categories|year
----+-----+------+-----+----------+----
0 |#12:0|Books |BookA|[2] |1980
1 |#12:1|Books |BookA|[1] |1985
2 |#12:2|Books |BookA|[2] |1984
3 |#12:3|Books |BookA|[1] |1980
4 |#12:4|Books |BookA|[1] |1981
5 |#12:5|Books |BookA|[1] |1990
----+-----+------+-----+----------+----
问题可能在于使用 =
而不是 IN
运算符,因为 categories
是 EMBEDDEDLIST
和 IN
运算符检查列表的每个值中是否存在输入参数(而 =
检查参数值是否与列表值完全相同)。
OSQL:
1) 使用 =
:
SELECT FROM Books WHERE categories = 'Adventure' AND year = 1980
0 item(s) found. Query executed in 0.0 sec(s).
2) 使用 IN
:
SELECT FROM Books WHERE 'Adventure' IN categories AND year = 1980
----+-----+------+-----+----------+----
# |@RID |@CLASS|title|categories|year
----+-----+------+-----+----------+----
0 |#12:0|Books |BookA|[2] |1980
1 |#12:3|Books |BookA|[1] |1980
----+-----+------+-----+----------+----
3) 使用 CONTAINS
:
SELECT FROM Books WHERE categories CONTAINS 'Adventure' AND year = 1980
----+-----+------+-----+----------+----
# |@RID |@CLASS|title|categories|year
----+-----+------+-----+----------+----
0 |#12:0|Books |BookA|[2] |1980
1 |#12:3|Books |BookA|[1] |1980
----+-----+------+-----+----------+----
JAVA:
private static String remote = "remote:localhost/";
public static void main(String[] args) {
String dbName = "DBname";
String path = remote + dbName;
OServerAdmin serverAdmin;
try {
serverAdmin = new OServerAdmin(path).connect("root", "root");
if (serverAdmin.existsDatabase()) {
System.out.println("Database '" + dbName + "' already exists");
ODatabaseDocumentTx db = new ODatabaseDocumentTx(path);
db.open("root", "root");
Iterable<ODocument> results = db.command(new OSQLSynchQuery<ODocument>(
"SELECT FROM Books WHERE 'Adventure' IN categories AND year = 1980")).execute();
for (ODocument result : results) {
System.out.println("Title: " + result.field("title") + " Category: " + result.field("categories")
+ " Year: " + result.field("year"));
}
db.close();
} else {
serverAdmin.createDatabase(dbName, "document", "plocal");
System.out.println("Database " + dbName + " created");
}
serverAdmin.close();
} catch (IOException e) {
e.printStackTrace();
}
}
输出:
Database 'DBname' already exists
Title: BookA Category: [Fantasy, Adventure] Year: 1980
Title: BookA Category: [Adventure] Year: 1980
希望对您有所帮助
我试图在我的 Java 应用程序中查询 OrientDB 中的嵌入式列表,但是当我将它与另一个 属性 组合时,我很难查询 属性 .
例如,这有效(类别是字符串的嵌入式列表):
select from Book where categories = :category
然而,当我这样查询时:
select from Book where categories = :category and year = 1980
然后突然我的查询不再给出任何结果,而我的数据库中肯定有 1980 年的书籍属于该类别。实际上,我网站上的所有书籍或 1980 年以来的书籍(但稍后,我还会添加 1981 年和 1982 年等的书籍)。
两个字段都已编入索引(NONUNIQUE 索引)。作为测试,我删除了年份的索引,结果查询再次正常运行。现在我很困惑:)
我用这个简单的结构试过你的案例:
CREATE CLASS Books
CREATE PROPERTY Books.title STRING
CREATE PROPERTY Books.categories EMBEDDEDLIST STRING
CREATE PROPERTY Books.year INTEGER
CREATE INDEX Books.categories ON Books(categories) NOTUNIQUE
CREATE INDEX Books.year ON Books(year) NOTUNIQUE
INSERT INTO Books(title, categories, year) VALUES('BookA', ['Fantasy','Adventure'], 1980)
INSERT INTO Books(title, categories, year) VALUES('BookA', ['Fantasy'], 1985)
INSERT INTO Books(title, categories, year) VALUES('BookA', ['Horror','Adventure'], 1984)
INSERT INTO Books(title, categories, year) VALUES('BookA', ['Adventure'], 1980)
INSERT INTO Books(title, categories, year) VALUES('BookA', ['Historical'], 1981)
INSERT INTO Books(title, categories, year) VALUES('BookA', ['Thriller'], 1990)
这是 class Books
:
SELECT FROM Books
----+-----+------+-----+----------+----
# |@RID |@CLASS|title|categories|year
----+-----+------+-----+----------+----
0 |#12:0|Books |BookA|[2] |1980
1 |#12:1|Books |BookA|[1] |1985
2 |#12:2|Books |BookA|[2] |1984
3 |#12:3|Books |BookA|[1] |1980
4 |#12:4|Books |BookA|[1] |1981
5 |#12:5|Books |BookA|[1] |1990
----+-----+------+-----+----------+----
问题可能在于使用 =
而不是 IN
运算符,因为 categories
是 EMBEDDEDLIST
和 IN
运算符检查列表的每个值中是否存在输入参数(而 =
检查参数值是否与列表值完全相同)。
OSQL:
1) 使用 =
:
SELECT FROM Books WHERE categories = 'Adventure' AND year = 1980
0 item(s) found. Query executed in 0.0 sec(s).
2) 使用 IN
:
SELECT FROM Books WHERE 'Adventure' IN categories AND year = 1980
----+-----+------+-----+----------+----
# |@RID |@CLASS|title|categories|year
----+-----+------+-----+----------+----
0 |#12:0|Books |BookA|[2] |1980
1 |#12:3|Books |BookA|[1] |1980
----+-----+------+-----+----------+----
3) 使用 CONTAINS
:
SELECT FROM Books WHERE categories CONTAINS 'Adventure' AND year = 1980
----+-----+------+-----+----------+----
# |@RID |@CLASS|title|categories|year
----+-----+------+-----+----------+----
0 |#12:0|Books |BookA|[2] |1980
1 |#12:3|Books |BookA|[1] |1980
----+-----+------+-----+----------+----
JAVA:
private static String remote = "remote:localhost/";
public static void main(String[] args) {
String dbName = "DBname";
String path = remote + dbName;
OServerAdmin serverAdmin;
try {
serverAdmin = new OServerAdmin(path).connect("root", "root");
if (serverAdmin.existsDatabase()) {
System.out.println("Database '" + dbName + "' already exists");
ODatabaseDocumentTx db = new ODatabaseDocumentTx(path);
db.open("root", "root");
Iterable<ODocument> results = db.command(new OSQLSynchQuery<ODocument>(
"SELECT FROM Books WHERE 'Adventure' IN categories AND year = 1980")).execute();
for (ODocument result : results) {
System.out.println("Title: " + result.field("title") + " Category: " + result.field("categories")
+ " Year: " + result.field("year"));
}
db.close();
} else {
serverAdmin.createDatabase(dbName, "document", "plocal");
System.out.println("Database " + dbName + " created");
}
serverAdmin.close();
} catch (IOException e) {
e.printStackTrace();
}
}
输出:
Database 'DBname' already exists
Title: BookA Category: [Fantasy, Adventure] Year: 1980
Title: BookA Category: [Adventure] Year: 1980
希望对您有所帮助