龙空技术网

二、JanusGraph && GQL

SuperGloo 451

前言:

目前姐妹们对“apachexp系统”大概比较注意,姐妹们都想要剖析一些“apachexp系统”的相关资讯。那么小编在网摘上汇集了一些有关“apachexp系统””的相关知识,希望大家能喜欢,我们快快来学习一下吧!

1、JanusGraph简介

1.1 JanusGraph简介

  JanusGraph是一个可扩展的图数据库,可以把包含数千亿个顶点和边的图存储在多机集群上。它支持事务,支持数千用户实时、并发访问存储在其中的图。(JanusGraph is a scalable graph database optimized for storing and querying graphs containing hundreds of billions of vertices and edges distributed across a multi-machine cluster. JanusGraph is a transactional database that can support thousands of concurrent users executing complex graph traversals in real time.)

我们可以将图数据库系统的应用领域划分成以下两部分:

·用于联机事务图的持久化技术(通常直接实时地从应用程序中访问)。这类技术被称为图数据库,它们和“通常的”关系型数据库世界中的联机事务处理(Online Transactional Processing,OLTP)数据库是一样的。

·用于离线图分析的技术(通常都是按照一系列步骤执行)。这类技术被称为图计算引擎。它们可以和其他大数据分析技术看做一类,如数据挖掘和联机分析处理(Online Analytical Processing,OLAP)。

1.2 JanusGraph的发展历史

JanusGraph是2016年12月27日从Titan fork出来的一个分支,之后TiTan的开发团队在2017年陆续发了0.1.0rc1、0.1.0rc2、0.1.1、0.2.0等四个版本,最新的版本是2017年10月12日。

  titan是从2012年开始开发,到2016年停止维护的一个分布式图数据库。最初在2012年启动titan项目的公司是Aurelius,2015年此公司被 DataStax(DataStax是开发apache Cassandra 的公司)收购,DataStax公司吸收了TiTan的图存储能力,形成了自己的商业产品DataStax Enterprise Graph。

  TiTan开发者们希望把TitTan放到Apache Software Foundation下,不过,DataStax不愿意这样做(可能考虑到要保护自己的商业产品DataStax Enterprise Graph的技术优势吧,其实这点优势是从Titan来的),而且自从2015年9月DataStax收购了Titan的母公司后,TiTan一直处于停滞状态(应该是DataStax收购之后,忙于推出自己的商业产品DataStax Enterprise Graph,忙于整合Titan进自己的商业产品吧,可是Titan本身没有得到发展)。鉴于此,2016年6月,TiTan的开发者们fork了一个TiTan的分支(因为Titan已经属于DataStax了,所以他们必须另外弄一个商标),重命名为JanusGraph,并将其置于Linux Software Foundation下。

  2017年4月6日发布了第一个版本0.1.0-rc1,目前最新版本是2017年10月12日发布的0.2.0版。

  JanusGraph项目启动的初衷是“通过为其增加新功能、改善性能和扩展性、增加后端存储系统来增强分布式图系统的功能,从而振兴分布式图系统的开发”,JanusGraph从Apahce TinkerPop中吸收了对属性图模型(Property Graph Model)的支持和对属性图模型进行遍历的Gremlin遍历语言。(“reinvigorate development of the distributed graph system to add new functionality, improve performance and scalability, and maintain a variety of storage backends,JanusGraph incorporates support for the property graph model with the open source graph computing framework Apache TinkerPop and its Gremlin graph traversal language”.)

1.3 JanusGraph的功能(Benefits)

  JanusGraph最大的一个好处就是:可以扩展图数据的处理,能支持实时图遍历和分析查询(Scaling graph data processing for real time traversals and analytical queries is JanusGraph’s foundational benefit.)。

  因为JanusGraph是分布式的,可以自由的扩展集群节点的,因此,它可以利用很大的集群,也就可以存储很大的包含数千亿个节点和边的图。由于它又支持实时、数千用户并发遍历图和分析查询图的功能。所以这两个特点是它显著的优势。

  它支持以下功能:

  (1)分布式部署,因此支持集群。

  (2)可以存储大图,比如包含数千亿Vertices和edges的图。

(3)支持数千用户实时、并发访问。

(4)集群节点可以线性扩展,以支持更大的图和更多的并发访问用户。(Elastic and linear scalability for a growing data and user base)

  (5)数据分布式存储,并且每一份数据都有多个副本,因此,有更好的计算性能和容错性。(Data distribution and replication for performance and fault tolerance)

  (6)支持在多个数据中心做高可用,支持热备份。(Elastic and linear scalability for a growing data and user base)

  (7)支持各种后端存储系统,目前标准支持以下四种,当然也可以增加第三方的存储系统:

·Apache Cassandra®

·Apache HBase®

·Google Cloud Bigtable

·Oracle BerkeleyDB

  (8)通过集成大数据平台,比如Apache Spark、Apache Giraph、Apache Hadoop等,支持全局图数据分析、报表、ETL

  (9)支持geo(Gene Expression Omnibus,基因数据分析)、numeric range(这个的含义不清楚)

  (10) 集成ElasticSearch、Apache Solr、Apache Lucene等系统后,可以支持全文搜索。

  (11) 原生集成Apache TinkerPop图技术栈,包括Gremlin graph query language、Gremlin graph server、Gremin applications。

  (12) 开源,基于Apache 2 Licence。

  (13) 通过使用以下系统可以可视化存储在JanusGraph中的图数据:

·Cytoscape

·Gephi plugin for Apache TinkerPop

·Graphexp

·KeyLines by Cambridge Intelligence

·Linkurious

1.4. JanusGraph的体系结构(architecture,架构)

想要深入了解JanusGraph,必须了解Tinkerpop。Tinkerpop是Apache基金会下的一个开源的图数据库与图计算框架(OLTP与OLAP),JanusGraph与Tinkerpop的关系可以认为是JanusGraph是基于Tinkerpop这个框架来开发的。

Tinkerpop有个组件叫Gremlin,它是一门用于图操作和图遍历的语言(也称查询语言)。Gremlin Console 和Gremlin Server分别提供了控制台和远程执行Gremlin查询语言的方式。Gremlin Server在JanusGraph中被成为JanusGraph Server。

Tinkerpop这个图数据库与图计算框架被很多厂商采用,比如百度开源的HugeGraph,华为的图引擎服务GES等。

JanusGraph是模块化的体系结构(JanusGraph has a modular architecture)。

  它使用hadoop来做图的分析和图的批处理,使用模块化接口来做数据持久化、索引和客户端访问。

  在JanusGraph和磁盘之间有多个后端存储系统和多个索引系统。(Between JanusGraph and the disks sits one or more storage and indexing adapters.)

  它支持的外部存储系统,目前标准支持的有(当然也可以将第三方的存储系统作为JanusGraph的后端存储系统):

·Apache Cassandra

·Apache HBase

·Oracle Berkeley DB Java Edition

·Google Cloud BigTable

  支持的外部索引系统:

·Elasticsearch

·Apache Solr

·Apache Lucene

  体系结构图:

1.5 应用使用JanusGraph的方法

  作为一个数据库系统,它是要用来为应用程序存储数据用的,那么应用程序应该如何使用JanusGraph来为自己存储数据呢?

  一般来说,应用程序可以通过两种不同的方式来使用JanusGraph:

  (1)第一种方式:可以把JanusGraph嵌入到应用程序中去,JanusGraph和应用程序处在同一个JVM中。应用程序中的客户代码(相对JanusGraph来说是客户)直接调用Gremlin去查询JanusGraph中存储的图,这种情况下外部存储系统可以是本地的,也可以处在远程。

  (2)第二种方式:应用程序和Janus Graph处在两个不同JVM中,应用通过给JanusGraph提交Gremlin查询给GremlinServer,来使用JanusGraph,因为JanusGraph原生是支持Gremlin Server的。(Gremlin Server是Apache Tinkerpop中的一个组件)。

1.6 JanusGraph的配置文件

  JanusGraph集群包含一个、或者多个JanusGraph实例。每次启动一个JanusGraph实例的时候,都必须指定JanusGraph的配置。在配置中,可以指定JanusGraph要用的组件,可以控制JanusGraph运行的各个方面,还可以指定一些JanusGraph集群的调优选项。

  最小的JanusGraph配置只需要指定一下JanusGraph的后端存储系统,也就是它的持久化引擎。

  如果要JanusGraph支持高级的图查询,就需要为JanusGraph指定一个索引后端。

  若果要提升JanusGraph的查询性能,就必须为JanusGraph指定缓存,指定性能调优的选项。

  以上提到的后端存储系统、索引后端、缓存、调优选项等都可以在JanusGraph的配置文件中进行指定。默认情况下它的配置文件存放在JanusGraph_home/conf目录下。

  在JanusGraph_home/conf目录下有一些JanusGraph的示例配置文件。

  下面是一个JanusGraph的示例配置文件的内容,这个文件中为JanusGraph指定了cassandra作为后端存储引擎,并且指定了elasticsearch作为索引后端。

storage.backend=cassandra

storage.hostname=localhost

index.search.backend=elasticsearch

index.search.hostname=100.100.101.1, 100.100.101.2

index.search.elasticsearch.client-only=true

1.7 JanusGraph配置文件的加载方法

  JanusGraph的配置文件如何加载呢?

  (1)对于单独安装的JanusGraph,可以在Gremlin中使用JanusGraphFactory类的方法来加载配置文件

  graph = JanusGraphFactory.open('path/to/configuration.properties')

  (2)对于嵌入到应用中的JanusGraph来说,应用可以直接调用JanusGraph的公共API,只要在应用中调用JanusGraph的JanusGraphFactory就可以加载配置文件了

  (3)还可以在JanusGraphFactory中使用简写来加载配置。

    graph = JanusGraphFactory.open('cassandra:localhost');

    graph = JanusGraphFactory.open('berkeleyje:/tmp/graph');

1.8 JanusGraph分布式集群的安装方法

  JanusGraph作为一个图数据库系统,其实还是比较复杂的,它的安装可以是很简单的单机安装,也可以是很复杂的分布式安装,最不可理解的是官网(janusgraph.org)上没有专门介绍安装的文档。这里的安装方法是从IBM Developer works搜索来的,下面着重介绍单机安装,分布式集群的安装较为复杂,目前还没有时间做,以后在做吧,任务在即。

  从JanusGraph的架构图可以看出,Janus的安装需要以下组件:

  (1)外部存储系统,上图左下的方框,JP也集成了一个Cassandra,可以用于单一数据库使用

  (2)外部索引系统,上图右下的方框,JP本身集成了一个ES,这个是可选的。

  (3)启动JanusGraph Server,上图中部的方框,它是从Apache Tinkpop项目中的Gremlin Server来的。

  (4)启动Gremlin客户端去连接JanusGraph Server,上图中部方框中的小框Tinkpop API-Gremlin指的是Gremlin console这个客户端是调用了Tinkpop API去访问JanusGraph Server的。

1.9 JanusGraph的命令接口使用方法

  如下的命令会创建一个图,如下所示:

  它有3个顶点,2个边

  3 vertex:

  v1: label student property id: 1

  v2: no label, no property

  v3: label studentproperty id: 2

  2 edges with label friends

  graph = JanusGraphFactory.open('conf/janusgraph-cassandra.properties');

  mgmt = graph.openManagement();

  student = mgmt.makeVertexLabel('student').make();

  friends = mgmt.makeEdgeLabel('friends').make();

  mgmt.commit();

  v1 = graph.addVertex(label, 'student');

  v1.property('id', '1');

  v2 = graph.addVertex();

  v3 = graph.addVertex(label, 'student');

  v3.property('id', '2');

  graph.tx().commit();

  v1.addEdge('friends', v2);

  v1.addEdge('friends', v3);

  graph.tx().commit();

  graph.traversal().V();

  graph.traversal().V().values('id');

  graph.traversal().E();

2、部署JanusGraph

2.1 docker install

The following section gives a minimal introduction on how to use the JanusGraph Docker images. For a more detailed documentation, refer to the README.md, especially for information about configuration of the images. The source repository also contains example configuration and Docker Compose files.

Usage

Start a JanusGraph Server instance

The default configuration uses the Oracle Berkeley DB Java Edition storage backend and the Apache Lucene indexing backend

$ docker run --name janusgraph-default janusgraph/janusgraph:latest

Connecting with Gremlin Console

Start a JanusGraph container and connect to the janusgraph server remotely using Gremlin Console

$docker run --rm --link janusgraph-default:janusgraph -e GREMLIN_REMOTE_HOSTS=janusgraph \

-it janusgraph/janusgraph:latest ./bin/gremlin.sh

gremlin> :remote connect tinkerpop.server conf/remote.yaml

==>Configured janusgraph/172.17.0.2:8182

gremlin> :> g.addV('person').property('name', 'chris')

==>v[4160]

gremlin> :> g.V().values('name')

==>chris

2.2 local install

下载地址:

In order to run JanusGraph, Java 8 SE is required. Make sure the $JAVA_HOME environment variable points to the correct location where either JRE or JDK is installed. JanusGraph can be downloaded as a .zip archive from the Releases section of the project repository.

The default configuration uses the Oracle Berkeley DB Java Edition storage backend and the Apache Lucene indexing backend

$ unzip janusgraph-0.5.2.zip

$ ./bin/gremlin-server.sh start

./bin/gremlin.sh

gremlin> :remote connect tinkerpop.server conf/remote.yaml

==>Configured localhost/127.0.0.1:8182

远程连接:

需要修改remote.yaml的地址

3、Gremlin Query Language

Gremlin是janusgraph的查询语言,用来获取/变更图数据。Gremlin是一个面向path的语言,能够简单快速的完成图遍历和变化操作。Gremlin是一个功能性语言,因此遍历操作被声明到类path的表达式表单。例如,from Hercules, traverse to his father and then his father’s father and return the grandfather’s name。

Gremlin是Apache TinkerPop的组件。它独立于janusgraph发展,并且被支持于大多数图数据库。建在janusgraph上的应用程序通过Gremlin查询语言,用户避免被发行商锁在一个图数据库上。

这章是Gremlin查询语言的简要概述。更多信息可以参考以下资源:

· Complete Gremlin Manual: Gremlin全部步骤的手册.

· Gremlin Console Tutorial: 学习如何用Gremlin Console高效图遍历,和交互式图分析.

· Practical Gremlin Book: 图数据库用户和Gremlin查询语言的起步教程。

· Gremlin Recipes: Gremlin的最佳实践集合和常见的图遍历语法。

· Gremlin Language Drivers: 用不同的语言连接到Gremlin server,如 Go, JavaScript, .NET/C#, PHP, Python, Ruby, Scala, and TypeScript.

· Gremlin Language Variants: 学习如何内嵌Gremlin到一个主机编程语言。

· Gremlin for SQL developers: 学习用SQL查询数据,Gremlin的经典语法。

3.1 :remote

:remote 命令告诉控制台配置一个到服务端的远程连接,该链接建立使用 conf/remote.yaml配置文件。 这个配置文件指向了一个运行在localhost的Gremlin Server 实例。 :>命令表示 提交命令, 它会把在那一行的Gremlin命令发送到远端服务器。 默认情况下,远程连接是无会话的,这意味着在控制台中发送的每一行都被解释为单个请求。 使用分号作为分割符,可以在一行上发送多个语句。 或者,您可以在创建连接时通过指定session建立带有会话的控制台。 console session 允许您在多行输入中重用变量。

gremlin> :remote connect tinkerpop.server conf/remote.yaml

3.2 :图遍历

gremlin> g.V().has('name', 'hercules').out('father').out('father').values('name')==>saturn

上面的查询可以分成以下步骤:

g:当前graph。V:graph中所有顶点。has('name', 'hercules'): 过滤出顶点有属性name = "hercules" (这里只有一个)。out('father'):从Hercules遍历出边(outgoing edge)为father的顶点。out('father'):从Hercules的father (Jupiter)遍历出边为father的顶点。name: 拿出顶点的name属性的value。

放到一起,这些步骤构成了类似遍历查询的路径。每一步都能分解且得到结果。当构造大型、复杂的查询链,这种图遍历/查询的风格是很有用的。

标签: #apachexp系统