![](/img/trans.png)
[英]NoSQL statistics type query with BaasBox - OrientDB 1.7.10
[英]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.