OrientDB API 高性能的文档、图数据库开源项目

我要开发同款
匿名用户2023年03月30日
50阅读
开发技术Java
所属分类数据库相关、图数据库
授权协议MulanPSL-2.0

作品详情

OrientDB是一款高性能的文档、图数据库,在关系查找、遍历方面有很大的速度优势,特别是处理传统关系型数据库中的join操作,图数据库具有无法比拟的优点。虽然OrientDB官方提供了Java的SDK,但是还是有一定的学习成本,需要手撸操作脚本,本仓库对OrientDB的JavaSDK进行了二次封装,以更加自然的语言操作OrientDB,降低学习成本,使得项目能更快的集成OrientDB。

特性更简单的API :话不多说上例子感受,假如我们要保存一个People对象到图数据库,先看看原生的SDK例子:

publicstaticvoidmain(String[]args){//使用原生JDK保存一个“人”顶点到图数据库Peoplepeople1=newPeople("张三","男",18);try(ODatabaseSessionsession=OrientSessionFactory.getInstance().getSession()){//在图数据库创建Class:Peopleif(session.getClass("People")==null){session.createVertexClass("People");}OVertexvertex=session.newInstance();vertex.setProperty("name",people1.getName());vertex.setProperty("age",people1.getAge());vertex.save();}}原生的SDK将顶点封装成了Overtex对象,首先需要先获取会话ODatabaseSession,并且创建对应的顶点类,然后将实体相关的属性需要调用setProperty方法存入进去,并且保存,还要要留意关闭会话,对于属性多、数量多的实体简直是灾难,下面我们来看看使用OrientDBAPI:

publicstaticvoidmain(String[]args){//创建实体对象Peoplepeople2=newPeople("李四","男",21);//将实体对象包装成ResourceNode对象,其提供了对顶点的操作,对边的操作在ResourceRelation里ResourceNode<People>li=newGraphResourceNode<>(people2);//直接调用save方法进行保存li.save();}@Getter@Setter@ToString//实现Vertex语义接口,表明该实体是一个图数据库的顶点对象publicclassPeopleimplementsVertex{privateStringname;privateStringsex;privateIntegerage;publicPeople(Stringname,Stringsex,Integerage){this.name=name;this.sex=sex;this.age=age;}publicPeople(){}}

如上图,通过上面的语句就将实体对象People1存入了OrientDB。

更优雅的查询 :原生SDK的查询难免会跟OrientDB的SQL语句或者Match语句打交道,而且国内的中文文档很少和相关博客也很少,学习成本进一步加大,因此OrientDBAPI对常用查询操作进行了封装,做到完全透明化,下面我们来看一个示列:使用原生SDK进行查询:

publicstaticvoidmain(String[]args){try(ODatabaseSessionsession=OrientSessionFactory.getInstance().getSession()){OResultSetresultSet=session.query("select*fromPeoplewherename=?","李四");Peoplepeople=newPeople();while(resultSet.hasNext()){OResultresult=resultSet.next();people.setName(result.getProperty("name"));people.setAge(result.getProperty("age"));}resultSet.close();}}原生JDK使用起来跟JDBC差不多,体验差,下面看看OrientDBAPI查询:

publicstaticvoidmain(String[]args){//创建资源图对象,其提供了很多对图的直接操作。使用OrientDB存储库(后续可以拓展Neo4j等存储库)ResourceGraphgraph=newResourceGraph(newOrientDBRepository());//调用extractNode方法取出指定节点ResourceNode<People>peopleResourceNode=graph.extractNode(QueryParamsBuilder.newInstance().addParams("name","李四").getParams());//获取节点对应的属性实体Peoplepeople=peopleResourceNode.getSource();}更人性化的遍历 :单一的查询肯定不能满足实际的需要,OrientDB提供了图的遍历,支持更复杂的查询,通过遍历我们能找到与任意一个节点有某种关系的其他节点,使用原生SDK如下:

publicstaticvoidmain(String[]args){try(ODatabaseSessionsession=OrientSessionFactory.getInstance().getSession()){//从顶点#74:0出发,深度优先遍历7层以内的同学,并且进行分页OResultSetresultSet=session.query("select*from(traverse*from#74:0MAXDEPTH7STRATEGYDEPTH_FIRST)where(@class=\"Classmate\")skip0limit10");List<ClassMates>classMates=newArrayList<>();while(resultSet.hasNext()){ClassMatesclassMate=newClassMates(null);OResultresult=resultSet.next();classMate.setDate(result.getProperty("date"));//...classMates.add(classMate);}resultSet.close();}}使用OrientDBAPI

publicstaticvoidmain(String[]args){//创建资源图对象,其提供了很多对图的直接操作。使用OrientDB存储库(后续可以拓展Neo4j等存储库)ResourceGraphgraph=newResourceGraph(newOrientDBRepository());//直接调用traverse方法,参数分别是,出发节点、深度、遍历策略、分页配置、目标实体类型PagedResult<ResourceNode<?extendsVertex>>result=graph.traverse(graph.extractNode("#74:0"),QueryParamsBuilder.newInstance().getParams(),7,TraverseStrategy.DEPTH_FIRST,newPageConfig(1,10,true),ClassMates.class);result.getSources().forEach(item->System.out.println(item.getSource()));}无需语句,透明化,更人性化。

声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态

评论