LightGraph 新手指南

Version: 1.4.2

2019/06/28

北京费马科技有限公司


目录


引言

图数据库是一种新型数据库,它用于存储和查询以顶点和边构成的图数据。

LightGraph 是北京费马科技有限公司自主研发的图数据库。本文将介绍 LightGraph 的特性及使用方法。通过阅读本文档,您将了解到以下信息:

LightGraph 特性

LightGraph 是费马科技自主研发的图数据库产品。其主要特点是单机大数据量,高吞吐率,以及灵活的 API,同时支持高效的在线事务处理(OLTP)和在线分析处理(OLAP)。本章将描述 LightGraph 的特性,以及它与同类产品的对比。

特性

LightGraph 是一个基于属性图模型、支持外存存储、高吞吐、高可用的图数据库。它有如下特征:

与其它产品对比

表 1 对比了 LightGraph 与 Neo4j 的部分特性。Neo4j 是市场上最成熟的图数据库系统。与之相比,LightGraph 拥有更强大的事务处理性能,其优势在数据规模超出内存容量(进入外存)后更加显著。此外,Neo4j 默认提供的事务隔离性是 Read Committed,如果用户需要更高的隔离等级,需要自行在应用程序中实现锁机制,这一问题也导致了如果需要在 Neo4j 中执行 OLAP 任务,其导出的时间很多情况下甚至会与计算所用时间相当甚至更长,同时会影响其它事务的处理;而 LightGraph 则提供 Serializable Snapshot Isolation 的隔离级别,导出可以通过轻量级的只读事务完成,并在需要的情况下使用多个线程并行导出,大大提升了在线分析的性能。

LightGraph 与 Neo4j 部分特性对比

-Neo4jLightGraph
实现语言JavaC++
外存支持
外存时性能
高可用
事务隔离性Read CommittedSerializable
OLAP 性能
Python 接口
C++接口
REST API
Cypher
存储过程
内置索引

安装与配置

本章将讲述 LightGraph 的使用方法,包括安装部署,启动/停止服务,以及各操作接口。

安装

系统要求

表 2 显示的是 LightGraph 对系统的配置要求。目前我们建议用户使用 NVMe SSD 配合较大的内存以获得最佳性能。

LightGraph 系统要求

-支持配置建议配置
CPUX86 或者 X86_64Xeon E5 2670 v4
内存4GB256GB
硬盘100GB1TB NVMe SSD
操作系统Linux 2.6 以上Ubuntu 16.04 LTS, CentOS 7.3

Ubuntu 下的安装方法

LightGraph 提供.deb 安装包,其中包含了 LightGraph 可执行文件以及编写嵌入模式程序和存储过程所需的头文件和库。

在终端下安装,只需要运行以下命令:

该命令默认将 LightGraph 安装于/usr/local 目录下。

如果您需要卸载 LightGraph,可运行以下命令:

CentOS 下的安装方法

LightGraph 提供.rpm 安装包,包内所含功能模块与.deb 包一致。在 CentOS 系统下安装、卸载及使用过程与 Ubuntu 系统下相似。 在终端下安装,运行以下命令进行安装:

如果需要安装到指定目录,可以通过—​prefix 选项指定安装目录。比如想要将 LightGraph 安装在/opt/lgraph 目录,需要运行的命令如下:

卸载 LightGraph 的命令如下:

配置和启动

运行 LightGraph 服务器前,我们还需要对它进行配置。LightGraph 的配置文件是 lgraph.json。图 1 是一个简单的配置示例。

图 1 LightGraph 配置文件示例.

默认安装的情况下,在/usr/local/etc/lgraph.json 中带有默认配置,您只需要根据该文件稍做修改即可。配置完成后,输入以下命令就可以运行 lgraph_server:

如果在 log 中看到“listening for requests at: http://localhost:7070/db” 字样,则说明 LightGraph 已经成功启动。

输入以下命令关闭 lgraph_server:

使用 LightGraph

数据模型

LightGraph 是一个基于属性图模型(property graph model)且支持强 Schema 的图数据库。

属性图模型

LightGraph 使用的属性图模型有以下特性:

下图是属性图的一个例子,在图中,顶点被标记为 PersonMovie 的标签,拥有若干属性, 顶点由标记为 ACTED_IN 的边相连,边同样拥有属性。

电影-演员图.

property graph example

顶点

如前所述,顶点拥有唯一标签和若干属性,往往用来表示一个实体,比如一个人、一部电影或一个 城市等。

在图数据库中,边用来表示顶点之间的关系,比如“认识”关系、“参演”关系或“居住于”关系等。边 是图数据库区别于传统数据库的关键特性,为实体之间的关系提供了快捷优雅的查询方式。

与顶点类似,边也拥有唯一标签和若干属性。在 LightGraph 中,边是有向边,每条边都有一个 源顶点和一个目的顶点。

属性

属性可以用来描述顶点或边的属性,每个属性是一个 key-value 对,其中 key 是属性名,类型为字符 串,value 是属性值,LightGraph 支持的属性值类型为:

标签

在 LightGraph 中,顶点和边都有且只有一个标签。每一种标签划分一种类型的实体,对应一种 属性存储方式(即 Schema),可以类比于关系型数据库中的表(Table)的概念。

Schema

在 LightGraph 中,Schema 与标签一一对应,用以描述某种 Label 的顶点或边的数据组织方式, 并且规定了域的约束。

例如,下表是 Person 标签对于的 Schema:

field nametypesizeoptional
nameSTRING-false
bornINT162true

工作模式

LightGraph 具有两种工作模式:嵌入模式以及服务器模式。在嵌入模式中,LightGraph 作为一个代码库运行于应用程序的进程中,因此可以很方便的部署,而且能取得很好的性能。在服务器模式中,LightGraph 作为一个独立的服务进程运行,用户可以通过 REST API 对 LightGraph 进行操作。本节将分别介绍两种模式的使用方法。

服务器模式(Server Mode)

LightGraph 可以作为独立的服务进程运行。此时,用户可以通过部署多机热备份来提高系统的可用性。

当 LightGraph 运行于服务器模式时,应用程序可以通过 REST API 来操作数据库。具体 API 请参考[《LightGraph REST API》].

REST API 使得用户可以通过各种语言来操作数据库,只要该语言能够访问和解析 REST 服务。它提供的主要功能有:

嵌入模式(Embedded Mode)

LightGraph 可以像 SQLite 以及 Neo4j 一样,嵌入到应用程序中。应用程序可以直接通过 LightGraph 的 API 对数据库进行操作。这种模式下,LightGraph 就像一个函数库一样,应用程序直接通过内存调用与之交互,从而避免了复杂的网络传输,这样部署简单,而且效率很高。

LightGraph 为嵌入模式提供了 Python 接口和 C++接口。两者实现的功能是完全一致的,只是语言不同。

在嵌入模式中,用户可以新建或者打开数据库,并在数据库中进行查询和修改操作。在嵌入模式下,用户可以对数据进行所有增删查改操作。由于嵌入模式下 LightGraph 与应用程序处于同一进程中,其操作性能较高。LightGraph 在嵌入模式不会启动网络服务,因此嵌入模式下 LightGraph 不具有多机备份的高可用性。

嵌入模式具体 API 请参考《LightGraph Python API》和《LightGraph C++ API》。

建立 Schema

在建立顶点和边之前,LightGraph 要求先定义顶点和边的数据类型(Schema)。这与关系数据库类似。通过事先定义顶点和边的类型,数据库可以对数据的存储和读取做优化。使用 REST API 建立 Schema 的方法请参考《LightGraph REST API》,这里以嵌入模式 Python API 为例说明建立 Schema 的过程,在此文档的后续部分,如无说明默认使用嵌入模式 Python API。

建立 Schema 需要定义标签名(label),以及相应的数据结构。比如在图 2 所举的例子中,我们需要对企业节点和个人节点,以及它们之间的边建立 Schema,其相应的操作如下:

图 2 建立 Schema.

LightGraph 允许用户指定多种不同的数据类型,并且可指定某些数据列是否可为空。具体 API 请参考相应 API 文档。

顶点和边操作

插入操作

LightGraph 的每个顶点由一个内部的整型 id 唯一标识,因此两个顶点可以拥有完全一样的数据。用户插入顶点时,数据库会给顶点分配一个新的唯一 id,同时将它返回给用户。用户可以在后续的操作中通过这个 id 来访问该顶点。

LightGraph 要求插入的边的起点和终点都必须存在,也就是说,要插入一条边{U,V}就需要先保证顶点 U 和顶点 V 存在于数据库中。

图 3 插入顶点和边.

遍历

遍历操作是图中最常见的查询之一。LightGraph 允许用户从顶点出发遍历它的所有出边和入边。遍历出边的操作更高效,因为 LightGraph 会将出边的数据与顶点数据连续存储在一起。

图 4 遍历操作.

修改/删除

用户可以修改顶点和边的属性,只要数据格式符合定义。用户还可以随时删除边和顶点。在删除顶点时,LightGraph 会同时删除它的所有出边的入边,以保证所有边都是有效的。

图 5 修改和删除.

索引操作

LightGraph 内置索引支持。用户可以对顶点的不同数据列进行索引。数据库将按照该列的数据类型对顶点进行排序。

LightGraph 允许用户在非空的数据库上建立索引。数据库将在后台对已存在的数据进行索引。根据负载不同,建立索引所需要的时间也不一样。用户可以通过 API 随时查询索引状态。

对于已经建立的索引,数据库会自动维护其状态,当用户对数据进行修改时,数据库会相应修改索引,保持索引的正确性。

值得注意的是,索引的维护会带来数据库写入性能的下降。如果用户认为某些索引已经无用,可以考虑将其删除。

图 6 索引操作.

批量加载数据

有时用户需要大批量的导入数据,此时可以使用 LightGraph 的批量导入功能以提高导入性能,参考 《LightGraph Import Tool》

快速查看数据库

LightGraph 提供 lgraph_peek 工具,供用户快速查看数据库内容使用。

示例 1,查看 vid 在一定范围的数据(图的一个片段):.

$ lgraph peek --dir test/testdb/ -b 3 -e 4

输出形式如下:

示例 2,查看整个数据库内容:.

存储过程

对于简单查询,用户可以通过 Cypher 语言来实现。但是有时用户需要编写比较复杂的逻辑(如带权最短路径),使用 Cypher 就很难实现这些复杂逻辑。因此 LightGraph 提供了存储过程,允许用户使用嵌入模式 API 编写一个存储过程,将它加载到服务器中,然后通过 REST API 来调用。

当用户调用存储过程时,服务器会将用户的输入参数传递给存储过程,然后调用该存储过程,最后将存储过程的输出通过 REST API 返回。存储过程完全运行在服务器上,因此可以高效的访问数据,完成复杂的逻辑。

存储过程可以使用 Python 或者 C++编写,使用的 API 与嵌入式完全一致。建议用户在嵌入式模式下将存储过程调度完毕这后再加载到服务器上。存储过程具体用法请参考《LightGraph 存储过程》。

内置算法

为了方便使用,LightGraph 基于 OLAP 接口实现了一系列内置算法。用户可以在自己编写的存储过程中直接调用这些算法,最大程度地降低了开发成本。LightGraph 可以无缝通过调用 PandaGraph 的算法,具体参考 PandaGraph 的文档。