2016-03-27 11 views
1

JavaアプリケーションのOrientDBで埋め込みリストをクエリしようとしていますが、他のプロパティと組み合わせてプロパティをクエリするのは苦労します。例えばOrientDB内の他のプロパティと組み合わせたクエリ埋め込みリスト

、これは(カテゴリは文字列のembeddedlistです)動作します。

select from Book where categories = :category 

私はこのようなクエリしかし、:

select from Book where categories = :category and year = 1980 

すると突然、私のクエリはもう何も結果が得られていません、一方、1980年代の私のDBには確かにそのカテゴリーの本があります。実際、私のサイトや1980年以降のすべての本(しかし、1981年と1982年の本も追加します)。

両方のフィールドにインデックスが付けられます(NONUNIQUEインデックス)。テストのように、私は今年のインデックスを削除して、クエリが正常に動作することを確認します。今私は混乱しています:)

答えて

4

私はこの簡単な構造で、あなたのケースを試みた:

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 
----+-----+------+-----+----------+---- 

問題がで可能性がありcategoriesEMBEDDEDLISTであり、IN演算子がリストのすべての値で入力パラメータの存在をチェックするため、IN演算子の代わりに=を使用します(while =は、パラメータ値がリスト値とまったく同じかどうかをチェックします)。

OSQLCONTAINSを使用

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 

が、それはこの精巧な答えを

+0

感謝を役に立てば幸い!私はそれが動作するかどうかテストします。とても有難い。しかし、=、in、containsの違いは何ですか? –

+2

こんにちは@Erik違いは: =条件が別のものと一致するかどうかをチェックするのに使用され、どのタイプのデータにも適用されます INは、結果がリスト内のいずれかの要素に含まれているかコレクションでのみ使用されます コレクションには、少なくとも次の条件を満たす要素が含まれ、コレクションに使用されている場合に使用されます。 詳細については、http://orientdb.com/docs/を参照してください。 2.0/orientdb.wiki/SQL-Where.html –

+0

こんにちはErik、私はCONTAINSの例で答えを更新しました。あなたはクエリを試す機会がありますか? – LucaS

関連する問題