Orientdb NoSQL有条件地执行查询

时间:2018-04-18 20:14:15

标签: nosql orientdb orientdb2.2

我正在使用OrientDB REST API,并且我正在尝试找到一种检查边缘的方法,如果仅使用一个POST请求不存在则创建它。多个查询和命令都很好,只是想最大限度地减少服务器来回创建的开销。

我编写了一个查询来检查OrientDB内置的Tolkien-Arda数据集中的边缘:

true

这个丑陋的查询怪物只计算从rosaBaggins到adalgrimTook的边数,如果返回的值大于0则返回“true”,否则返回false。

但是我不确定如何进行下一步并执行CREATE EDGE查询(如果为true)。帮助赞赏这一点,或者更有效地写下我疯狂的查询,我感觉我已经很难完成了。

3 个答案:

答案 0 :(得分:2)

如果您希望通过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();
}

希望有所帮助

此致

答案 1 :(得分:1)

由于没有提到使用Java,我只会为您提供此边缘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)。

答案 2 :(得分:0)

使用@mitchken答案的一部分,我已经弄明白了。

from(START)
  .split(body().tokenize(","))
  .to(DEST)

第一次将此脚本发送到服务器会在&#39; asdfasdf&#39;之间创建新的边缘。 (我刚创建的顶点)和&#39; adalgrimTook&#39;,并返回新边的@rid。我第二次将脚本发送到服务器时,它会返回“已经存在”。

同样重要的是要注意(让我非常沮丧地想到这一点)是LET语句不能在Web GUI上的CLI或Browse选项卡中工作,但作为POST脚本可以正常工作。