简体   繁体   English

如何在OrientDB中选择随机文档

[英]How select random documents in OrientDB

I write online game. 我写网络游戏。 For game logic, I need select random users(etc) from database. 对于游戏逻辑,我需要从数据库中选择随机用户(等)。 How to achive this with java api? 如何使用Java API实现此目标? What the most perfomance way to do this? 最有效的方法是什么?

I can use something like(pseudocode): select from User skip(randomNum(0,usersCount)) limit 1 but how write in documentation - skip has bad performance. 我可以使用类似的信息(伪代码): select from User skip(randomNum(0,usersCount)) limit 1 ,但在文档怎么写- skip有坏的表现。

I have tried with this code 我已经尝试过此代码

int numberRandom= 5;
String string="[";
int cluster= db.getMetadata().getSchema().getClass("User").getClusterIds()[0];   
for(int i=0;i<numberRandom;i++){
    int random=ThreadLocalRandom.current().nextInt(0, 96000);
    if(i==(numberRandom-1))
        string += cluster+":"+random + "]";
    else
        string += cluster+":"+random + ",";

}
Iterable<Vertex> result = g.command(new OCommandSQL("select from "+ string)).execute();
for(Vertex v:result)
    System.out.println(v.getId());

Let me know if it can be a good solution for you 让我知道这是否对您来说是一个好的解决方案

I wrote two java classes, both are getting X random users from a specific cluster. 我编写了两个Java类,它们都从特定集群中获得X个随机用户。

The first one seams faster to me. 第一个接缝对我更快。 (about 0.8s vs 1.2s) (约0.8s和1.2s)

testRandom.java testRandom.java

    public class testRandom {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

                String nomeDb = "RandomUser";

                try {
                    OServerAdmin serverAdmin = new OServerAdmin("remote:localhost/"+nomeDb).connect("root", "root");
                    if(serverAdmin.existsDatabase()){  // il db esiste
                        //connessione a db
                        OrientGraph g = new OrientGraph("remote:localhost/"+nomeDb);

                        //------------------------------------------------
                        long Tbegin,Tend;
                        float millis;
                        Tbegin = System.currentTimeMillis();

                        int numberRandom= 5;
                        int random;
                        String cluster = "user";
                        Iterable<Vertex> vertices = g.command(new OCommandSQL("select from cluster:"+cluster)).execute();
                        List<Vertex> v_array = new ArrayList<Vertex>();
                        List<Vertex> res = new ArrayList<Vertex>();

                        for(Vertex v : vertices){
                            v_array.add(v);
                        }
                        int arraysize = v_array.size();
                        for(int i=0;i<numberRandom;i++){
                            random=ThreadLocalRandom.current().nextInt(0, arraysize);
                            res.add(v_array.get(random));
                        }

                        for(Vertex v : res){
                            System.out.println(v.getId());
                        }


                        Tend = System.currentTimeMillis();
                        millis = (Tend-Tbegin);
                        System.out.println("--Execution time: "+millis/1000+ "s\n");

                        //------------------------------------------------

                        //chiude db
                        g.shutdown();
                    }
                    else{
                        System.out.println("Il database '"+ nomeDb + "' non esiste");
                    }
                    serverAdmin.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }

    }

}

testRandomSkip.java testRandomSkip.java

public class testRandom_skip {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

                String nomeDb = "RandomUser";

                try {
                    OServerAdmin serverAdmin = new OServerAdmin("remote:localhost/"+nomeDb).connect("root", "root");
                    if(serverAdmin.existsDatabase()){  // il db esiste
                        //connessione a db
                        OrientGraph g = new OrientGraph("remote:localhost/"+nomeDb);

                        //------------------------------------------------
                        long Tbegin,Tend;
                        float millis;
                        Tbegin = System.currentTimeMillis();

                        int numberRandom= 5;
                        int random;
                        String cluster = "user";

                        List<Vertex> res = new ArrayList<Vertex>();
                        Iterable<Vertex> q_count_V = g.command(new OCommandSQL("select count(*) from cluster:"+cluster)).execute();
                        Long count_V = 0l;
                        for(Vertex v : q_count_V){
                            count_V=v.getProperty("count");
                            break;
                        }

                        for(int i=0;i<numberRandom;i++){
                            random=(int)ThreadLocalRandom.current().nextLong(0, count_V);
                            Iterable<Vertex> vertex = g.command(new OCommandSQL("select from cluster:"+cluster+" skip "+random+" limit 1")).execute();
                            for(Vertex v : vertex){
                                res.add(v);
                                break;
                            }
                        }

                        for(Vertex v : res){
                            System.out.println(v.getId());
                        }


                        Tend = System.currentTimeMillis();
                        millis = (Tend-Tbegin);
                        System.out.println("--Execution time: "+millis/1000+ "s\n");

                        //------------------------------------------------

                        //chiude db
                        g.shutdown();
                    }
                    else{
                        System.out.println("Il database '"+ nomeDb + "' non esiste");
                    }
                    serverAdmin.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }

    }

}

Hope it helps. 希望能帮助到你。 Ivan 伊万

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM