sqlg rdbms 上实现的Apache TinkerPop
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的更多相关文章
- Windows OS上安装运行Apache Kafka教程
Windows OS上安装运行Apache Kafka教程 下面是分步指南,教你如何在Windows OS上安装运行Apache Zookeeper和Apache Kafka. 简介 本文讲述了如何在 ...
- WEB文件上传之apache common upload使用(一)
文件上传一个经常用到的功能,它有许多中实现的方案. 页面表单 + RFC1897规范 + http协议上传 页面控件(flash/html5/activeX/applet) + RFC1897规范 + ...
- 在Mac上搭建本地Apache服务器一些注意点
一般在开发ios程序中,我们需要使用到和服务器的交互操作. 一般我们在Mac上使用Apache来搭建服务器.数据库采用MySQL.在Mac中Apache是自带的.所有,我们可以不需要额外的去Apple ...
- 转载:centos上yum安装apache+php+mysql等
1. 更新系统内核到最新. [root@linuxfei ~]#yum -y update 系统更新后,如果yum安装时提示错误信息,请执行以下命令修复. [root@linuxfei ~]#rpm ...
- Linux上安装Mysql+Apache+Php
一.安装Mysql 1.卸载默认的mysql yum -y remove mysql-libs-* Removed: mysql-libs.x86_64 0:5.1.73-3.el6_5 卸载成功 ...
- Web---文件上传-用apache的工具处理、打散目录、简单文件上传进度
我们需要先准备好2个apache的类: 上一个博客文章只讲了最简单的入门,现在来开始慢慢加深. 先过渡一下:只上传一个file项 index.jsp: <h2>用apache的工具处理文件 ...
- windows上不能启动Apache,遇到错误的方法之一
最近在2008服务器上安装apache,出现了No installed ConfigArgs for the service "Apache2.4"这个错误. 启动不了,重装了一样 ...
- (转)文件上传org.apache.tomcat.util.http.fileupload.FileUploadException: Stream closed
文件上传时,tomcat报错org.springframework.web.multipart.MultipartException: Failed to parse multipart servle ...
- 文件上传之Apache commons fileupload使用
后台servlet代码: File file1 = null,file2=null; String description1 = null,description2 = ...
随机推荐
- 更新Linux内核
说明:为了安装Docker,当前虚拟机不满足要求,版本如下: [root@localhost116 ~]# uname -r -.el6.x86_64 [root@localhost116 ~]# c ...
- Python 中拼音库 PyPinyin 的用法【华为云技术分享】
[摘要] 最近碰到了一个问题,项目中很多文件都是接手过来的中文命名的一些素材,结果在部署的时候文件名全都乱码了,导致项目无法正常运行. 后来请教了一位大佬怎么解决文件名乱码的问题,他说这个需要正面解决 ...
- 每天固定备份db sqlserver
DECLARE @DBName varchar(255) DECLARE @DATABASES_Fetch int DECLARE DATABASES_CURSOR CURSOR FOR select ...
- hystrix完成对redis访问的资源隔离
相对来说,考虑的比较完善的一套方案,分为事前,事中,事后三个层次去思考怎么来应对缓存雪崩的场景 1.事前解决方案 发生缓存雪崩之前,事情之前,怎么去避免redis彻底挂掉 redis本身的高可用性,复 ...
- Linux学习笔记之grep命令和使用正则表达式
0x00 正则表达式概述 正则表达式是描述一些字符串的模式,是由一些元字符和字符组成的字符串,而这些元字符是一些表示特殊意义的字符,即被正则表达式引擎表达的字符表示与其本意不同的一些字符. 0x01 ...
- @interface __ annotation 子类可以继承到父类上的注解吗--有结论了
博客分类: Java/J2se 作者:赵磊 博客:http://elf8848.iteye.com 不了解注解基础知识的请先看<JDK 5 Annotation\注解\注释\自定义注解> ...
- MVC拦截
1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Web; 5using Syst ...
- delegate、Action、Func的用法
委托的特点 委托类似于 C++ 函数指针,但它们是类型安全的. 委托允许将方法作为参数进行传递. 委托可用于定义回调方法. 委托可以链接在一起. delegate的用法 delegate void B ...
- opencv简单卷积运用
import cv2 as cv import numpy as np img=cv.imread('learn.jpg',cv.IMREAD_GRAYSCALE) cv.imshow('first ...
- 下载文件时-修改文件名字 Redis在Windows中安装方法 SVN安装和使用(简单版) WinForm-SQL查询避免UI卡死 Asp.Net MVC Https设置
下载文件时-修改文件名字 1后台代码 /// <summary> /// 文件下载2 /// </summary> /// <param name="Fil ...