私はこの簡単な構造で、あなたのケースを試みた:
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)
をして、これはクラス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
----+-----+------+-----+----------+----
問題がで可能性がありcategories
がEMBEDDEDLIST
であり、IN
演算子がリストのすべての値で入力パラメータの存在をチェックするため、IN
演算子の代わりに=
を使用します(while =
は、パラメータ値がリスト値とまったく同じかどうかをチェックします)。
OSQL:CONTAINS
を使用
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):IN
を使用
SELECT FROM Books WHERE categories = 'Adventure' AND year = 1980
0 item(s) found. Query executed in 0.0 sec(s).
2):
1)=
を使用
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
が、それはこの精巧な答えを
感謝を役に立てば幸い!私はそれが動作するかどうかテストします。とても有難い。しかし、=、in、containsの違いは何ですか? –
こんにちは@Erik違いは: =条件が別のものと一致するかどうかをチェックするのに使用され、どのタイプのデータにも適用されます INは、結果がリスト内のいずれかの要素に含まれているかコレクションでのみ使用されます コレクションには、少なくとも次の条件を満たす要素が含まれ、コレクションに使用されている場合に使用されます。 詳細については、http://orientdb.com/docs/を参照してください。 2.0/orientdb.wiki/SQL-Where.html –
こんにちはErik、私はCONTAINSの例で答えを更新しました。あなたはクエリを試す機会がありますか? – LucaS