sqlg 可以让关系型数据库支持Apache TinkerPop,当前支持的数据库有postgresql,hsqldb,h2,mariadb,mysql,mssqlserver
以下是一个简单的使用

环境准备

  • postgresql
version: "3"
services:
  postgres:
    image: postgres:9.6.11
    ports:
    - "5432:5432"
    environment:
    - "POSTGRES_PASSWORD:dalong"

代码

简单测试,了解下实现处理

  • maven pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.dalong</groupId>
    <artifactId>tinkerpop-postgresql</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <encoding>UTF-8</encoding>
        <java.version>1.8</java.version>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.umlg</groupId>
            <artifactId>sqlg-postgres</artifactId>
            <version>2.0.0</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.8</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>
 
 
  • 代码结构
├── README.md
├── docker-compose.yaml
├── pom.xml
├── src
│ ├── main
│ │ ├── java
│ │ │ └── com
│ │ │ └── dalong
│ │ │ └── Application.java
│ │ └── resources
│ │ └── datasource.properties
│ └── test
│ └── java
│ └── InsertTest.java
 
  • 测试代码
    InsertTest.java
 
import org.apache.tinkerpop.gremlin.structure.Graph;
import org.apache.tinkerpop.gremlin.structure.T;
import org.apache.tinkerpop.gremlin.structure.Vertex;
import org.junit.Before;
import org.junit.Test;
import org.umlg.sqlg.structure.SqlgGraph;
import java.time.LocalDate;
import java.util.List;
import static junit.framework.Assert.assertEquals;
public class InsertTest {
    Graph sqlgGraph = null;
    public InsertTest(){
        sqlgGraph = SqlgGraph.open("datasource.properties");
    }
    @Test
    public void useAsPerNormal() {
        Vertex person = this.sqlgGraph.addVertex(T.label, "Person", "name", "John");
        Vertex address = this.sqlgGraph.addVertex(T.label, "Address", "street", "13th");
        person.addEdge("livesAt", address, "since", LocalDate.of(2010, 1, 21));
        this.sqlgGraph.tx().commit();
        List<Vertex> addresses = this.sqlgGraph.traversal().V().hasLabel("Person").out("livesAt").toList();
        assertEquals(3, addresses.size());
    }
    @Test
    public void testElementsInSchema() {
        Vertex john = this.sqlgGraph.addVertex(T.label, "Manager", "name", "john");
        Vertex palace1 = this.sqlgGraph.addVertex(T.label, "continent.House", "name", "palace1");
        Vertex corrola = this.sqlgGraph.addVertex(T.label, "fleet.Car", "model", "corrola");
        palace1.addEdge("managedBy", john);
        corrola.addEdge("owner", john);
        this.sqlgGraph.tx().commit();
        assertEquals(1, this.sqlgGraph.traversal().V().hasLabel("Manager").count().next().intValue());
        assertEquals(0, this.sqlgGraph.traversal().V().hasLabel("House").count().next().intValue());
        assertEquals(1, this.sqlgGraph.traversal().V().hasLabel("continent.House").count().next().intValue());
        assertEquals(0, this.sqlgGraph.traversal().V().hasLabel("Car").count().next().intValue());
        assertEquals(1, this.sqlgGraph.traversal().V().hasLabel("fleet.Car").count().next().intValue());
        assertEquals(1, this.sqlgGraph.traversal().E().hasLabel("managedBy").count().next().intValue());
        assertEquals(1, this.sqlgGraph.traversal().E().hasLabel("owner").count().next().intValue());
    }
}
 
 
  • 启动&&运行
    使用junt 运行测试
  • 效果

  • sql 生成处理
    官方包含了关于sql生成的处理过程
    如下以下处理:
 
@Test
public void showVertexStep() {
    Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1");
    Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1");
    Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "b2");
    Vertex c1 = this.sqlgGraph.addVertex(T.label, "C", "name", "c1");
    Vertex c2 = this.sqlgGraph.addVertex(T.label, "C", "name", "c2");
    a1.addEdge("ab", b1);
    a1.addEdge("ab", b2);
    b1.addEdge("bc", c1);
    b2.addEdge("bc", c2);
    this.sqlgGraph.tx().commit();
    GraphTraversal<Vertex, Vertex> traversal = this.sqlgGraph.traversal().V()
            .hasLabel("A")
            .out()
            .out();
    System.out.println(traversal);
    traversal.hasNext();
    System.out.println(traversal);
    List<Vertex> c = traversal.toList();
    assertEquals(2, c.size()); 

生成的sql

SELECT
    "public"."V_C"."ID" AS "alias1",
    "public"."V_C"."name" AS "alias2"
FROM
    "public"."V_A" INNER JOIN
    "public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" INNER JOIN
    "public"."V_B" ON "public"."E_ab"."public.B__I" = "public"."V_B"."ID" INNER JOIN
    "public"."E_bc" ON "public"."V_B"."ID" = "public"."E_bc"."public.B__O" INNER JOIN
    "public"."V_C" ON "public"."E_bc"."public.C__I" = "public"."V_C"."ID"
 

以上只是部分,实际上sqlg 也做了很多的优化处理

说明

facebook 开源的ent 也是一个类似的,但是ent 从性能以及使用上就很简单了,ent支持代码生成(主要基于模版)
ent 对于图遍历的各种模型的支持还是比较全的,只是当前支持的数据库比较少,mysql,sqlite 以及gremlin,计划
线路有支持postgresql,同时代码中也包含了,部分关于pg 的处理。

参考资料

https://github.com/apache/tinkerpop/
http://sqlg.org/docs/2.0.0-SNAPSHOT/#_introduction
https://github.com/facebookincubator/ent

sqlg rdbms 上实现的Apache TinkerPop的更多相关文章

  1. Windows OS上安装运行Apache Kafka教程

    Windows OS上安装运行Apache Kafka教程 下面是分步指南,教你如何在Windows OS上安装运行Apache Zookeeper和Apache Kafka. 简介 本文讲述了如何在 ...

  2. WEB文件上传之apache common upload使用(一)

    文件上传一个经常用到的功能,它有许多中实现的方案. 页面表单 + RFC1897规范 + http协议上传 页面控件(flash/html5/activeX/applet) + RFC1897规范 + ...

  3. 在Mac上搭建本地Apache服务器一些注意点

    一般在开发ios程序中,我们需要使用到和服务器的交互操作. 一般我们在Mac上使用Apache来搭建服务器.数据库采用MySQL.在Mac中Apache是自带的.所有,我们可以不需要额外的去Apple ...

  4. 转载:centos上yum安装apache+php+mysql等

    1. 更新系统内核到最新. [root@linuxfei ~]#yum -y update 系统更新后,如果yum安装时提示错误信息,请执行以下命令修复. [root@linuxfei ~]#rpm ...

  5. Linux上安装Mysql+Apache+Php

    一.安装Mysql 1.卸载默认的mysql yum -y remove mysql-libs-* Removed:  mysql-libs.x86_64 0:5.1.73-3.el6_5 卸载成功 ...

  6. Web---文件上传-用apache的工具处理、打散目录、简单文件上传进度

    我们需要先准备好2个apache的类: 上一个博客文章只讲了最简单的入门,现在来开始慢慢加深. 先过渡一下:只上传一个file项 index.jsp: <h2>用apache的工具处理文件 ...

  7. windows上不能启动Apache,遇到错误的方法之一

    最近在2008服务器上安装apache,出现了No installed ConfigArgs for the service "Apache2.4"这个错误. 启动不了,重装了一样 ...

  8. (转)文件上传org.apache.tomcat.util.http.fileupload.FileUploadException: Stream closed

    文件上传时,tomcat报错org.springframework.web.multipart.MultipartException: Failed to parse multipart servle ...

  9. 文件上传之Apache commons fileupload使用

    后台servlet代码:         File file1 = null,file2=null;         String description1 = null,description2 = ...

随机推荐

  1. 『摆渡车 斜率优化dp及总结』

    摆渡车的题解我已经写过一遍了,在这里,这次主要从斜率优化的角度讲一下摆渡车,并总结一下斜率优化会出现的一些奇奇怪怪的错误. 摆渡车 Description 有 n 名同学要乘坐摆渡车从人大附中前往人民 ...

  2. centos7安装mysql初始化报错

    [root@localhost bin]# ./mysqld --initialize --user=mysql2019-09-16T06:15:28.835202Z 0 [Warning] TIME ...

  3. 关于海大邮箱(ouc.edu)客户端配置及使用说明

    关于海大邮箱(ouc.edu)客户端配置及使用说明 邮箱说明 系统简介 海大邮箱使用的是论客(Coremail)提供的邮件系统:(很多大学都是) Coremail论客简介(摘自官网): Coremai ...

  4. latex中添加C++代码

    用到listings宏包,模板如下: \documentclass[UTF8]{ctexart} \usepackage[a4paper,top=2cm,bottom=2cm,left=2cm,rig ...

  5. Redis 获取和设置密码

    1.config get reuqirepass //获取当前密码 2.config set requirepass "password"//设置当前密码,双引号里面为密码

  6. [08001] Could not create connection to database server. Attempted reconnect 3 times. Giving up IDEA2019的database插件无法链接mysql的解决办法(08001错误)

    [08001] Could not create connection to database server. Attempted reconnect 3 times. Giving up. 点击这里 ...

  7. 创建你自己定制的vuejs plugin扩展app的功能

    什么是vuejs plugin插件 vuejs plugin插件是一个向你的app注入新的全局功能的强大但又简约的方式.从概念上来说,vue plugin非常简单,它就是一个包含了install方法的 ...

  8. postman发送数据,django 获取接收数据

    postman发起请求如下图 在django中使用如下方式获取token print(request.META) token = request.META.get('HTTP_X_TOKEN')

  9. 微信小程序分页加载列表

    1.假设加载的数据为 2.wxml <view class="page"> <view class="page__bd"> <vi ...

  10. Java深入学习(1):多线程

    多线程目的:在同一时刻有多条不同路径执行程序,提高程序运行效率 多线程应用:数据库连接池,多线程文件下载等 注意:在文件下载中使用多线程,无法提高速度 在一个进程中,一定会有主线程 从基础开始,多线程 ...