Showing posts with label orientdb. Show all posts
Showing posts with label orientdb. Show all posts

Thursday, 28 January 2016

Orient DB query to find first level friend


Problem:
How to find first level friend in my network in orient db

Solution:
select flatten(distinct(in)) as in from (traverse V.out, E.in from #10:1178 while $depth <=1)
    where @class='Friends'

Where #10:1178 is the record id of the User.

How to create custom vertex class property and index in orientdb

Go to orientdb bin folder,Run console.sh

Connecting To database
connect remote:localhost/harvest_dev admin admin

Create Class
create class User extends V;
CREATE PROPERTY User.fid STRING;
CREATE PROPERTY User.lid STRING;
CREATE PROPERTY User.fbn STRING;
CREATE PROPERTY User.au STRING;
CREATE INDEX lidx ON User (lid) notunique;
CREATE INDEX fidx ON User (fid) notunique;
Create Class
create class Company extends V
CREATE PROPERTY Company.fcid STRING
CREATE PROPERTY Company.fcn STRING
CREATE PROPERTY Company.cn STRING
CREATE PROPERTY Company.cid STRING
CREATE INDEX fb_cmp_id_inx ON Company (fcidnotunique
CREATE INDEX cidx ON Company (cidnotunique

How to get edge between to vertex in orientdb

There are 2 ways to get Edge between the edges.

OrientVertex v1
OrientVertex v2
Iterable<Edge> edges = v1.getEdges( v2, Direction.BOTH, "Friends" );
edges.iterator().hasNext();

But it some times return false even if edges exists between v1 and v2.

Instead Use below code to get Edges.

String query="select from (traverse V.out, E.in from "+node1.getIdentity()+" while $depth <=1) "+
                      "where @class='Friends' and in=?";
            OSQLSynchQuery<ODocument> query1 = new OSQLSynchQuery<ODocument>(query);
            Iterable<ODocument> result = graph.command(query1).execute(node2.getIdentity());
            if (null != result && result.iterator().hasNext()) {
                connAdded = true;
            }

how to get existing vertex in orientdb , performance issue

Lets say you have created a class User and created the orient vertex with user id equal to uid.
you have also created the unique index on uid.
Now if you get the vertex using below code ,it will not use index and query will be to slow.
Iterable<Vertex> iterable = graph.getVertices("user.uid",
                    uid);
Iterator<Vertex> iterator = iterable.iterator();

Instead use below code to get orient vertex.which will use index and will give the result fast.
OIndexManager idxManager = graph.getRawGraph().getMetadata().getIndexManager();
        OIndex<?> idx = idxManager.getIndex("uidx");
        OIdentifiable user = (OIdentifiable) idx.get("uid");
        if(null==user){
            return null;
        }
        final ODocument value = ((OIdentifiable) user).getRecord();
        CVertex v = null;
        if (value.getSchemaClass().isSubClassOf(OrientVertex.CLASS_NAME)) {
            // DIRECT VERTEX
            v = new CVertex(graph, value);
        }else{
            return null;
        }
        return v.get();

public class CVertex extends OrientVertex{

    public CVertex(OrientBaseGraph graph, OIdentifiable record) {
        super(graph, record);
        // TODO Auto-generated constructor stub
    }
    public OrientVertex get(){
        return (OrientVertex)this;
    }

}

How to convert ODocument to OrientVertex in orientdb

Create custom class CVertex
public class CVertex extends OrientVertex{

    public CVertex(OrientBaseGraph graph, OIdentifiable record) {
        super(graph, record);
        // TODO Auto-generated constructor stub
    }
    public OrientVertex get(){
        return (OrientVertex)this;
    }

}   
OrientGraph graph = new OrientGraph(
            "dburl", "admin", "admin");
OIndexManager idxManager = graph.getRawGraph().getMetadata().getIndexManager();
        OIndex<?> idx = idxManager.getIndex(INDEX_CONSTANTS.FB_ID_INDEX);
        OIdentifiable user = (OIdentifiable) idx.get(fbId);
        if(null==user){
            return null;
        }
        final ODocument value = ((OIdentifiable) user).getRecord();
        CVertex v = null;
        if (value.getSchemaClass().isSubClassOf(OrientVertex.CLASS_NAME)) {
            // DIRECT VERTEX
            v = new CVertex(graph, value);
        }else{
            return null;
        }
        return v.get();