推特 阿里云技术文档正文

Java_SDK参考_图数据库GDB

admin 阿里云技术文档 2020-02-11 253 0
阿里云服务器优惠

Java

本文介绍如何基于Java编程环境连接和操作图数据库GDB。这是以常驻服务形式操作图数据库GDB的常用形式。

进行以下操作时,请确保图数据库GDB的实例与您的ECS虚拟机处于同一个Virtual Private Cloud(VPC)网络环境。

环境准备 (以CentOS示意)

1、添加具有Maven程序包的存储库

  1. wget http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo
  2. -O /etc/yum.repos.d/epel-apache-maven.repo

2、设置该存储库的版本号

  1. sudo sed -i s/\$releasever/6/g /etc/yum.repos.d/epel-apache-maven.repo

3、下载并安装Maven

  1. sudo yum install -y apache-maven

安装Java

1、 安装JDK 8.0

  1. sudo yum install java-1.8.0-devel

2、 如果您的ECS实例上有多个Java版本,请将Java8设置为默认运行

  1. sudo /usr/sbin/alternatives --config java
  2. 共有 4 个提供“java”的程序。
  3. 选项 命令
  4. -----------------------------------------------
  5. *+ 1 java-1.8.0-openjdk.x86_64 (/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.191.b12-1.el7_6.x86_64/jre/bin/java)
  6. 2 java-1.8.0-openjdk.x86_64 (/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.191.b12-0.el7_5.x86_64-debug/jre/bin/java)
  7. 3 java-1.7.0-openjdk.x86_64 (/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.191-2.6.15.4.el7_5.x86_64/jre/bin/java)
  8. 4 /usr/lib/jvm/jre-1.6.0-openjdk.x86_64/bin/java

编写Java客户端代码

1、 创建gdb-gremlin-test的目录

  1. mkdir gdb-gremlin-test;
  2. cd gdb-gremlin-test

2、 创建pom.xml文件,并写入如下内容

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>com.gdb.alibaba</groupId>
  5. <artifactId>GdbGremlinExample</artifactId>
  6. <packaging>jar</packaging>
  7. <version>1.0-SNAPSHOT</version>
  8. <name>GdbGremlinExample</name>
  9. <url>http://maven.apache.org</url>
  10. <dependencies>
  11. <dependency>
  12. <groupId>org.apache.tinkerpop</groupId>
  13. <artifactId>gremlin-driver</artifactId>
  14. <version>3.4.0</version>
  15. </dependency>
  16. </dependencies>
  17. <build>
  18. <plugins>
  19. <plugin>
  20. <groupId>org.apache.maven.plugins</groupId>
  21. <artifactId>maven-compiler-plugin</artifactId>
  22. <version>2.0.2</version>
  23. <configuration>
  24. <source>1.8</source>
  25. <target>1.8</target>
  26. </configuration>
  27. </plugin>
  28. <plugin>
  29. <groupId>org.codehaus.mojo</groupId>
  30. <artifactId>exec-maven-plugin</artifactId>
  31. <version>1.3</version>
  32. <configuration>
  33. <mainClass>com.gdb.alibaba.Test</mainClass>
  34. <complianceLevel>1.8</complianceLevel>
  35. </configuration>
  36. </plugin>
  37. </plugins>
  38. </build>
  39. </project>

4、创建目录并新建文件

  1. mkdir -p src/main/java/com/gdb/alibaba/;
  2. touch src/main/java/com/gdb/alibaba/Test.java

5、编写测试程序

  1. package com.gdb.alibaba;
  2. import org.apache.tinkerpop.gremlin.driver.Cluster;
  3. import org.apache.tinkerpop.gremlin.driver.Client;
  4. import org.apache.tinkerpop.gremlin.driver.Result;
  5. import org.apache.tinkerpop.gremlin.driver.ResultSet;
  6. import java.util.List;
  7. import java.util.Map;
  8. import java.util.HashMap;
  9. import java.io.File;
  10. public class Test
  11. {
  12. public static void main( String[] args )
  13. {
  14. try {
  15. if(args.length != 1) {
  16. System.out.println("gdb-remote.yaml path needed");
  17. return;
  18. }
  19. String yaml = args[0];
  20. Cluster cluster = Cluster.build(new File(yaml)).create();
  21. Client client = cluster.connect().init();
  22. String dsl = "g.addV(yourlabel).property(propertyKey, propertyValue)";
  23. Map<String,Object> parameters = new HashMap<>();
  24. parameters.put("yourlabel","area");
  25. parameters.put("propertyKey","wherence");
  26. parameters.put("propertyValue","shenzheng");
  27. ResultSet results = client.submit(dsl,parameters);
  28. List<Result> result = results.all().join();
  29. result.forEach(p -> System.out.println(p.getObject()));
  30. cluster.close();
  31. } catch (Exception e) {
  32. System.out.println(e.getMessage());
  33. }
  34. }
  35. }

6、 创建gdb-remote.yaml文件,该文件为Java客户端与GDB图数据库建立连接的配置文件

  • ${your-gdb-endpoint}改为您的图数据库GDB实例的域名
  • ${username}改为您的图数据库GDB实例的用户名
  • ${password}改为您的图数据库GDB实例的密码
  1. hosts: [ ${your_gdb_endpoint} ]
  2. port: 8182
  3. username: ${username}
  4. password: ${password}
  5. serializer: {
  6. className: org.apache.tinkerpop.gremlin.driver.ser.GraphBinaryMessageSerializerV1,
  7. config: { serializeResultToString: true }
  8. }

7、编译并执行

进入gdb-gremlin-test主目录,编译并执行java程序:

  1. mvn compile exec:java -Dexec.args="/root/apache-tinkerpop-gmlin-console-3.4.0/conf/gdb-remote.yaml"
  2. v[ba8f60b7-0786-4014-a4e2-451f09b79878]

更多dsl样例

  • 上面的示例是使用参数化的方式,通过dsl g.addV(yourlabel).property(propertyKey, propertyValue) 和参数map来添加点。
  • 下面结合具体的图的点、边结构来进行更多dsl示例,图的点、边结构链接 http://tinkerpop.apache.org/docs/current/reference/#traversal
  • 注意下面dsl需要改造成参数化的调用方式, 我们先用硬编码方式来进行范例讲解
    1. DSL硬编码:
    2. dsl = "user_defined_dsl";
    3. //比如:g.addV('sand131_id_5_99').property(id,'sand131_id_5_99').property('name','sand131_name_5_99')
    4. ResultSet results = client.submit(dsl);
    5. |
    6. |
    7. v
    8. 参数化脚本:
    9. String dsl ="g.addV(vertex).property(id,vertex).property('name',vertex)";
    10. Map<String, Object> parameters = new HashMap<>();
    11. parameters.put("vertex",“sand131_id_5_99”); //填写dsl语句中的vertex参数
    12. ResultSet results = client.submit(dsl, parameters,timeoutInMillis);

  1. 删除指定label的点、边

    1. g.E().hasLabel('gdb_sample_knows').drop()
    2. g.E().hasLabel('gdb_sample_created').drop()
    3. g.V().hasLabel('gdb_sample_person').drop()
    4. g.V().hasLabel('gdb_sample_software').drop()
  2. 添加顶点,为其设置id、property

    1. g.addV('gdb_sample_person').property(id, 'gdb_sample_marko').property('age', 28).property('name', 'marko')
    2. g.addV('gdb_sample_person').property(id, 'gdb_sample_vadas').property('age', 27).property('name', 'vadas')
    3. g.addV('gdb_sample_person').property(id, 'gdb_sample_josh').property('age', 32).property('name', 'josh')
    4. g.addV('gdb_sample_person').property(id, 'gdb_sample_peter').property('age', 35).property('name', 'peter')
    5. g.addV('gdb_sample_software').property(id, 'gdb_sample_lop').property('lang', 'java').property('name', 'lop')
    6. g.addV('gdb_sample_software').property(id, 'gdb_sample_ripple').property('lang', 'java').property('name', 'ripple')
  3. 修改(或新增) age 属性

    1. g.V('gdb_sample_marko').property('age', 29)
  4. 建立关系,设置属性 weight

    1. g.addE('gdb_sample_knows').from(V('gdb_sample_marko')).to(V('gdb_sample_vadas')).property('weight', 0.5f)
    2. g.addE('gdb_sample_knows').from(V('gdb_sample_marko')).to(V('gdb_sample_josh')).property('weight', 1.0f)
    3. g.addE('gdb_sample_created').from(V('gdb_sample_marko')).to(V('gdb_sample_lop')).property('weight', 0.4f)
    4. g.addE('gdb_sample_created').from(V('gdb_sample_josh')).to(V('gdb_sample_lop')).property('weight', 0.4f)
    5. g.addE('gdb_sample_created').from(V('gdb_sample_josh')).to(V('gdb_sample_ripple')).property('weight', 1.0f)
    6. g.addE('gdb_sample_created').from(V('gdb_sample_peter')).to(V('gdb_sample_lop')).property('weight', 0.2f)
  5. 查询所有点/指定label的点数量

    1. g.V().count()
    2. g.V().hasLabel('gdb_sample_person').count()
  6. 查询指定条件的顶点 (>29岁的人, 按name降序排列所有人)

    1. g.V().hasLabel('gdb_sample_person').has('age', gt(29))
    2. g.V().hasLabel('gdb_sample_person').order().by('name', decr)
  7. 关联查询(获取 marko 认识的人, marko认识的人created的software)

    1. g.V('gdb_sample_marko').outE('gdb_sample_knows').inV().hasLabel('gdb_sample_person')
    2. g.V('gdb_sample_marko').outE('gdb_sample_knows').inV().hasLabel('gdb_sample_person').outE('gdb_sample_created').inV().hasLabel('gdb_sample_software')
  8. 删除关系、顶点

    1. g.V('gdb_sample_marko').outE('gdb_sample_knows').where(inV().has(id, 'gdb_sample_josh')).drop()
    2. g.V('gdb_sample_marko').drop()

这里您可以进行其他更多测试,详细的Gremlin查询语句可以参考TinkerPop的Gremlin文档

版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

评论

-----