更优雅的OrientDB Java API

打印 上一主题 下一主题

主题 842|帖子 842|积分 2526

OrientDB API v1.0.0(OrientDB 3.x)

Gitee
OrientDB介绍

OrientDB是一个开源的NoSQL数据库管理系统,同时也是一款高性能的图数据库,支持ACID事务以及原子操作。
官网
图数据库介绍

图数据库是以点、边为基础存储单元,以高效存储、查询图数据为设计原理的数据管理系统。
图概念对于图数据库的理解至关重要。图是一组点和边的集合,“点”表示实体,“边”表示实体间的关系。在图数据库中,数据间的关系和数据本身同样重要 ,它们被作为数据的一部分存储起来。这样的架构使图[数据库]能够快速响应复杂关联查询,因为实体间的关系已经提前存储到了数据库中。图数据库可以直观地可视化关系,是[存储]、查询、分析高度[互联数据]的最优办法。
图数据库属于非关系型数据库(NoSQL)。图数据库对数据的存储、查询以及数据结构都和关系型数据库有很大的不同。图数据结构直接存储了节点之间的依赖关系,而关系型数据库和其他类型的非关系型数据库则以非直接的方式来表示数据之间的关系。图数据库把数据间的关联作为数据的一部分进行存储,关联上可添加标签、方向以及属性,而其他数据库针对关系的查询必须在运行时进行具体化操作,这也是图数据库在关系查询上相比其他类型数据库有巨大性能优势的原因。
最简单的说,图数据库对于关系型数据库中的join操作具有十分高的效率,每个节点存储了所有边的引用。
下面我们来看一个示列,加入圆代表一个学校教学楼,圆角矩形代表教学楼下面的教室,三角形代表教室的每一张桌椅,当我们需要获取一个楼宇下面的所有桌椅,在关系型数据库如MySQL中,就需要把教学楼表、教室表以及桌椅表join起来查询,虽然有索引,但当量上去后依然是一个昂贵的操作。而在图数据库如OrientDB中,就可以直接从教学楼出发通过广度优先或者深度优先直接找到桌椅,而且相比关系型数据库具有极高的效率。

OrientDB API

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

更简单的API :话不多说上例子感受,假如我们要保存一个People对象到图数据库,先看看原生的SDK例子:
  1. public static void main(String[] args) {
  2.             //使用原生JDK保存一个“人”顶点到图数据库
  3.         People people1 = new People("张三", "男", 18);
  4.         try (ODatabaseSession session = OrientSessionFactory
  5.                 .getInstance()
  6.                 .getSession()) {
  7.             //在图数据库创建Class:People
  8.             if (session.getClass("People") == null) {
  9.                 session.createVertexClass("People");
  10.             }
  11.             OVertex vertex = session.newInstance();
  12.             vertex.setProperty("name", people1.getName());
  13.             vertex.setProperty("age", people1.getAge());
  14.             vertex.save();
  15.         }
  16. }
复制代码
原生的SDK将顶点封装成了Overtex对象,首先需要先获取会话ODatabaseSession,并且创建对应的顶点类,然后将实体相关的属性需要调用setProperty方法存入进去,并且保存,还要要留意关闭会话,对于属性多、数量多的实体简直是灾难,下面我们来看看使用OrientDB API:
  1. public static void main(String[] args) {
  2.             //创建实体对象
  3.         People people2 = new People("李四", "男", 21);
  4.             //将实体对象包装成ResourceNode对象,其提供了对顶点的操作,对边的操作在ResourceRelation里
  5.             ResourceNode<People> li = new GraphResourceNode<>(people2);
  6.             //直接调用save方法进行保存
  7.             li.save();
  8. }
  9. @Getter
  10. @Setter
  11. @ToString
  12. //实现Vertex语义接口,表明该实体是一个图数据库的顶点对象
  13. public class People implements Vertex {
  14.     private String name;
  15.     private String sex;
  16.     private Integer age;
  17.     public People(String name, String sex, Integer age) {
  18.         this.name = name;
  19.         this.sex = sex;
  20.         this.age = age;
  21.     }
  22.     public People() {
  23.     }
  24. }
复制代码

如上图,通过上面的语句就将实体对象People1存入了OrientDB。
更优雅的查询 :原生SDK的查询难免会跟OrientDB的SQL语句或者Match语句打交道,而且国内的中文文档很少和相关博客也很少,学习成本进一步加大,因此OrientDB API对常用查询操作进行了封装,做到完全透明化,下面我们来看一个示列:使用原生SDK进行查询:
  1. public static void main(String[] args) {
  2.         try (ODatabaseSession session = OrientSessionFactory
  3.                 .getInstance()
  4.                 .getSession()) {
  5.             OResultSet resultSet = session.query("select * from People where name = ?", "李四");
  6.             People people=new People();
  7.             while(resultSet.hasNext()){
  8.                 OResult result= resultSet.next();
  9.                 people.setName(result.getProperty("name"));
  10.                 people.setAge(result.getProperty("age"));
  11.             }
  12.             resultSet.close();
  13.         }
  14. }
复制代码
原生JDK使用起来跟JDBC差不多,体验差,下面看看OrientDB API查询:
  1. public static void main(String[] args) {
  2.             //创建资源图对象,其提供了很多对图的直接操作。使用OrientDB存储库(后续可以拓展Neo4j等存储库)
  3.         ResourceGraph graph = new ResourceGraph(new OrientDBRepository());
  4.             //调用extractNode方法取出指定节点
  5.         ResourceNode<People> peopleResourceNode = graph.extractNode(QueryParamsBuilder
  6.                 .newInstance()
  7.                 .addParams("name", "李四")
  8.                 .getParams());
  9.             //获取节点对应的属性实体
  10.         People people = peopleResourceNode.getSource();
  11. }
复制代码
更人性化的遍历 : 单一的查询肯定不能满足实际的需要,OrientDB提供了图的遍历,支持更复杂的查询,通过遍历我们能找到与任意一个节点有某种关系的其他节点,使用原生SDK如下:
  1. public static void main(String[] args) {
  2.         try (ODatabaseSession session = OrientSessionFactory
  3.                 .getInstance()
  4.                 .getSession()) {
  5.             //从顶点#74:0出发,深度优先遍历7层以内的同学,并且进行分页
  6.             OResultSet resultSet = session.query("select * from (traverse * from #74:0 MAXDEPTH 7 STRATEGY DEPTH_FIRST) where (@class = "Classmate") skip 0 limit 10");
  7.             List<ClassMates> classMates=new ArrayList<>();
  8.             while(resultSet.hasNext()){
  9.                 ClassMates classMate=new ClassMates(null);
  10.                 OResult result= resultSet.next();
  11.                 classMate.setDate(result.getProperty("date"));
  12.                 //...
  13.                 classMates.add(classMate);
  14.             }
  15.             resultSet.close();
  16.         }
  17. }
复制代码
使用OrientDB API
[code]public static void main(String[] args) {              //创建资源图对象,其提供了很多对图的直接操作。使用OrientDB存储库(后续可以拓展Neo4j等存储库)           ResourceGraph graph = new ResourceGraph(new OrientDBRepository());               //直接调用traverse方法,参数分别是,出发节点、深度、遍历策略、分页配置、目标实体类型           PagedResult

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

悠扬随风

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表