簡體   English   中英

Orientdb NoSQL有條件地執行查詢

[英]Orientdb NoSQL conditionally execute a query

我正在使用OrientDB REST API,並試圖找到一種方法來檢查邊緣並創建邊緣(如果僅使用一個POST請求則不存在)。 多個查詢和命令都很好,只想最小化服務器來回創建的開銷。

我編寫了一個查詢來檢查OrientDB內置的Tolkien-Arda數據集中的邊緣:

SELECT IF(COUNT(*) FROM 
(SELECT FROM Begets
WHERE OUT IN (SELECT FROM Creature WHERE uniquename='rosaBaggins') 
AND IN IN (SELECT FROM Creature WHERE uniquename='adalgrimTook')) > 0, "True", "False")

查詢的這種丑陋性僅計算了從rosaBaggins到adalgrimTook有多少條邊,如果返回大於0,則返回“ true”,否則返回false。

但是我不確定如何進行下一步並執行CREATE EDGE查詢(如果為true)。 對此有所幫助,或者更有效地編寫了瘋狂的查詢,我感到我已經用辛苦的方式做到了。

如果您希望通過Java API做到這一點,則此代碼檢查是否存在從rosaBaggins到adalgrimTook的傳出邊緣:

String DB = "<db name>";
String path = "remote:localhost/" + DB;
OServerAdmin serverAdmin;

try
{
    serverAdmin = new OServerAdmin(path).connect("<username>", "<password>");
    if(serverAdmin.existsDatabase())
    {
        OrientGraphFactory factory = new OrientGraphFactory(path);
        OrientGraph g = factory.getTx();

        Iterable<Vertex> result = g.command(new OCommandSQL("SELECT FROM #18:0 WHERE out().uniquename contains 'adalgrimTook'")).execute();
        List<Vertex> list = new ArrayList<Vertex>();
        CollectionUtils.addAll(list, result.iterator());

        if(list.size() == 0)
        {
            System.out.println("Edge doesn't exist, I'm creating it ...");
            g.command(new OCommandSQL("CREATE EDGE connection FROM (SELECT FROM Creature WHERE uniquename = 'rosaBaggins') TO (SELECT FROM Creature WHERE uniquename = 'adalgrimTook')")).execute();
        }
        else
        {
            System.out.println("Edge already exist");
        }

        serverAdmin.close();
    }
}
catch(Exception e)
{
    e.printStackTrace();
}

希望能幫助到你

問候

由於沒有提到它是用Java編寫的,因此我僅向您提供此Edge Upsert的純SQL實現

let $1 = select from user where _id = 'x5mxEBwhMfiLSQHaK';
let $2 = select expand(both('user_story')) from story where _id = '5ab4ddea1908792c6aa06a93';
let $3 = select intersect($1, $2);
if($3.size() > 0) {
  return 'already inserted';
}
create edge user_story from (select from user where _id = 'x5mxEBwhMfiLSQHaK') to (select from story where _id = '5ab4ddea1908792c6aa06a93')
return 'just inserted';

我沒有使用tolkien-Arda的原始代碼,但可以隨意填寫該代碼。

該結構由用戶和他編寫的故事組成。 如果尚未鏈接,則會創建邊緣(user_story)。

使用@mitchken的答案的一部分,我已經弄清楚了。

LET $1 = SELECT expand(bothE('Begets')) from Creature where uniquename='asdfasdf';\
LET $2 = SELECT expand(bothE('Begets')) FROM Creature WHERE uniquename='adalgrimTook';\
LET $3 = SELECT INTERSECT($1, $2);\
LET $4 = CREATE EDGE Begets FROM (SELECT FROM Creature WHERE uniquename='asdfasdf') TO (SELECT FROM Creature WHERE uniquename='adalgrimTook');\
SELECT IF($3.INTERSECT.size() > 0, 'Already exists', $4)

第一次將此腳本發送到服務器時,會在“ asdfasdf”(我剛剛創建的一個頂點)和“ adalgrimTook”之間創建一個新邊,並返回新邊的@rid。 第二次將腳本發送到服務器時,它返回“已經存在”。

還需要注意的另一個重要事項(讓我很沮喪地弄清楚了這一點)是,LET語句在Web GUI的CLI或“瀏覽”選項卡中將不起作用,但可以很好地用作POST腳本。

暫無
暫無

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

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