簡體   English   中英

查詢嵌入列表與OrientDB中的其他屬性結合

[英]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)

這是在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

希望能幫助到你

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM