72
gStore 系统使用手册 gStore 团队编写 2019 7 29

gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

gStore 系统使用手册

由 gStore 团队编写

2019 年 7 月 29 日

Page 2: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

I

目录

一、 知识图谱与 gStore 介绍 ......................................................................................................... 1

二、 快速浏览 ..................................................................................................................................... 4

三、 安装指南 ..................................................................................................................................... 5

3.1 系统要求 .......................................................................................................................................... 5

3.2 安装环境准备 ................................................................................................................................. 5

3.2.1 zip/unzip 安装 .......................................................................................................................... 5

3.2.2 jdk 安装 ..................................................................................................................................... 6

3.2.3 gc++安装 ................................................................................................................................... 6

3.2.4 readline 安装 ............................................................................................................................ 6

3.2.5 boost 库安装 ............................................................................................................................. 6

3.2.6 curl 库安装................................................................................................................................ 7

3.3 gStore 获取 ....................................................................................................................................... 8

3.3.1 download ................................................................................................................................... 8

3.3.2 clone(推荐) ............................................................................................................................... 8

3.4 gStore 编译 ....................................................................................................................................... 8

3.5 gStore 安装成功!.......................................................................................................................... 9

四、 如何使用 ................................................................................................................................... 10

4.1 数据格式 ........................................................................................................................................ 10

4.2 gbuild ................................................................................................................................................ 10

4.3 gquery ............................................................................................................................................... 11

4.4 ghttp .................................................................................................................................................. 13

4.5 gserver .............................................................................................................................................. 15

4.6 gclient ............................................................................................................................................... 16

4.7 gconsole ........................................................................................................................................... 17

4.8 gadd ................................................................................................................................................... 17

4.9 gsub ................................................................................................................................................... 18

4.10 gmonitor ........................................................................................................................................ 18

4.11 gshow ............................................................................................................................................. 18

4.12 gdrop ............................................................................................................................................... 19

4.13 gexport ........................................................................................................................................... 19

Page 3: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

II

4.14 shutdown ....................................................................................................................................... 19

4.15 ginit ................................................................................................................................................. 20

4.16 test utilities .................................................................................................................................... 20

五、 API 使用 .................................................................................................................................... 23

5.1 C++ API ........................................................................................................................................... 25

5.2 Java API ........................................................................................................................................... 27

5.3 Python API ...................................................................................................................................... 29

5.4 Nodejs API ...................................................................................................................................... 31

5.5 Php API ............................................................................................................................................ 33

六、 workbench 使用 ....................................................................................................................... 36

6.1 登录 ................................................................................................................................................. 36

6.2 用户功能 ........................................................................................................................................ 36

6.3 查询功能 ........................................................................................................................................ 38

6.3.1 主页 ......................................................................................................................................... 38

6.3.2 数据库 ..................................................................................................................................... 39

6.3.3 用户管理 ................................................................................................................................ 40

七、 Docker 方式部署 gStore ....................................................................................................... 41

7.1 环境准备 ........................................................................................................................................ 41

7.2 直接拉取镜像运行(推荐).......................................................................................................... 41

7.3 通过 Dockerfile 构建镜像 ......................................................................................................... 41

7.4 后续工作 ........................................................................................................................................ 41

7.4.1 性能测试 ................................................................................................................................ 41

7.4.2 连接其他容器测试 .............................................................................................................. 41

7.4.3 构建精简优化 ....................................................................................................................... 42

八、 支持 SPARQL 语法介绍 ...................................................................................................... 43

8.1 进行简单查询 ............................................................................................................................... 43

8.1.1 简单查询 ................................................................................................................................ 43

8.1.2 多重匹配 ................................................................................................................................ 43

8.1.3 匹配 RDF 文字 ..................................................................................................................... 44

8.1.4 空白节点标签 ....................................................................................................................... 46

8.2 RDF 期限约束(RDF 项约束) .............................................................................................. 47

8.2.1 限制字符串的值 .................................................................................................................. 47

Page 4: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

III

8.3 包括可选值 ................................................................................................................................... 47

8.3.1 可选模式匹配 ....................................................................................................................... 47

8.3.2 可选模式匹配中的约束 ..................................................................................................... 48

8.3.3 多种可选图模式 .................................................................................................................. 49

8.4 匹配两个中的一个 ...................................................................................................................... 50

8.5 逻辑否定 ........................................................................................................................................ 52

8.6 结果排序和修改 .......................................................................................................................... 53

8.6.1 ORDER BY............................................................................................................................. 53

8.6.2 Projection ................................................................................................................................. 54

8.6.3 Duplicate Solutions ............................................................................................................... 54

8.6.4 OFFSET ................................................................................................................................... 56

8.6.5 LIMIT ....................................................................................................................................... 57

8.7 图更新 .............................................................................................................................................. 57

8.7.1 INSERT DATA ...................................................................................................................... 57

8.7.2 DELETE DATA .................................................................................................................... 59

8.7.3 ALTER DATA ....................................................................................................................... 61

九、 gStore 项目框架 ...................................................................................................................... 62

十、 发表论文 ................................................................................................................................... 63

十一、项目大事记 .................................................................................................................................. 64

十二、开源与法律条款 ......................................................................................................................... 66

12.1 开源与社区 ................................................................................................................................. 66

12.2 法律条款 ...................................................................................................................................... 66

十三、gStore 标识 ................................................................................................................................... 68

13.1 gStore 的图片标识 ..................................................................................................................... 68

13.2 Powered by gStore 推荐标识 ................................................................................................... 68

Page 5: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

1

一、 知识图谱与 gStore 介绍

(注:如果读者只是想了解如何使用 gStore 系统,并且对知识图谱、RDF 数

据和 SPARQL 查询语法有所了解,请从第三章或者第四章开始。)

近年来随着“人工智能”概念再度活跃,除了“深度学习”这个炙手可热的名词

以外,“知识图谱”无疑也是研究者、工业界和投资人心目中的又一颗“银弹”。简

单地说,“知识图谱”是一种数据模型,是以图形(Graph)的方式来展现“实体”、

实体“属性”,以及实体之间的“关系”。下图是截取的 Google 的知识图谱介绍网

页中的一个例子。在例子中有 4 个实体,分别是“达芬奇”,“意大利”,“蒙拉丽

莎”和“米可朗基罗”。这个图明确地展示了“达芬奇”的逐个属性和属性值(例如名

字、生日和逝世时间等),以及之间的关系(例如蒙拉丽莎是达芬奇的画作,达

芬奇出生在意大利等)。

目前知识图谱普遍采用了语义网框架中 RDF(Resource Description

Framework,资源模式框架)模型来表示数据。语义网是万维网之父蒂姆·伯纳斯-李

(Tim Berners-Lee)在 1998 年提出的概念,其核心是构建以数据为中心的网络,即

Web of Data。其中 RDF 是 W3C 的语义网框架中的数据描述的标准,通常称之为

RDF 三元组<主体 (subject),谓词 (predicate),宾语(object)>。其中主体一定是一

个被描述的资源,由 URI 来表示。谓词可以表示主体的属性,或者表示主体和宾

语之间某种关系;当表示属性时,宾语就是属性值,通常是一个字面值(literal);

否则宾语是另外一个由 URI 表示的资源。

下图展示了一个人物类百科的 RDF 三元组的知识图谱数据集。例如

y:Abraham_Lincoln 表 示 一 个 实 体 URI ( 其 中 y 表 示 前 缀

http://en.wikipedia.org/wiki/),其有三个属性(hasName,BornOndate,DiedOnDate)和

一个关系(DiedIn)。

Page 6: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

2

面向 RDF 数据集,W3C 提出了一种结构化查询语言 SPARQL;它类似于面

向关系数据库的查询语言 SQL。和 SQL 一样,SPARQL 也是一种描述性的结构

化查询语言,即用户只需要按照 SPARQL 定义的语法规则去描述其想查询的信

息即可,不需要明确指定如何进行查询的计算机的实现步骤。2008 年 1 月,

SPARQL 成为 W3C 的正式标准。SPARQL 中的 WHERE 子句定义了查询条件,

其也是由三元组来表示。我们不过多的介绍语法细节,有兴趣的读者可以参考[1]。

下面的例子解释了 SPARQL 语言。假设我们需要在上面的 RDF 数据中查询“在

1809 年 2 月 12 日出生,并且在 1865 年 4 月 15 日逝世的人的姓名?” 这个查询

可以表示成如下图的 SPARQL 语句。

知识图谱数据管理的一个核心问题是如何有效地存储 RDF 数据集和快速回

答 SPARQL 查询。总的来说,有两套完全不同的思路。其一是我们可以利用已有

的成熟的数据库管理系统(例如关系数据库系统)来存储知识图谱数据,将面向

RDF 知识图谱的 SPARQL 查询转换为面向此类成熟数据库管理系统的查询,例

如面向关系数据库的 SQL 查询,利用已有的关系数据库产品或者相关技术来回

答查询。这里面最核心的研究问题是如何构建关系表来存储 RDF 知识图谱数据,

并且使得转换的 SQL 查询语句查询性能更高;其二是直接开发面向 RDF 知识图

谱数据的 Native 的知识图谱数据存储和查询系统(Native RDF 图数据库系统),

考虑到 RDF 知识图谱管理的特性,从数据库系统的底层进行优化。

Page 7: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

3

我们所研发的 gStore 系统属于后者,我们将 RDF 和 SPARQL 分别表示成图

的形式,利用子图匹配的方法来回答 SPARQL 查询。例如在 RDF 中,主体和客

体可以分别表示成 RDF 图中的节点,一条称述(即 RDF 三元组)可以表示成一

条边,其中谓词是边的标签。SPARQL 语句同样可以表示成一个查询图。 图 3

显示了上例所对应的 RDF 图和 SPARQL 查询图结构。回答 SPARQL 查询本质上

就是在 RDF 图中找到 SPARQL 查询图的子图匹配的位置,这就是基于图数据库

的回答 SPARQL 查询的理论基础。在图 1-3 例子中,由节点 005,009,010 和

011 所推导的子图就是查询图的一个匹配,根据此匹配很容易知道 SPARQL 的查

询结果是“Abraham Lincoln”。关于 gStore 的核心学术思路,请参考第 10 章中

gStore 所发表的论文。

gStore 开始于北京大学计算机科学技术研究所数据管理组(PKUMOD)邹磊

教授与滑铁卢大学 Tamer Ozsu 教授、香港科技大学 Lei Chen 教授所撰写的 VLDB

2011 论文(Lei Zou, Jinghui Mo, Lei Chen,M. Tamer Ozsu, Dongyan Zhao, gStore:

Answering SPARQL Queries Via Subgraph Matching, Proc. VLDB 4(8): 482-493,

2011), 在论文中提出了利用子图匹配的方法回答SPARQL中的BGP (Basic Graph

Pattern)语句的查询执行方案。该文章发表以后,PKUMOD 实验室在中国自然科

学基金委项目和中国科技部重点研发课题等资助下,持续从事 gStore 系统的开

源、维护和系统优化工作。目前 Github 上开源的 gStore 系统可以支持 W3C 定义

的 SPARQL 1.1 标准(具体可支持的 SPARQL 语法,请参考第 8 章);单机可以

支持 30 亿以上的 RDF 三元组存储和 SPARQL 查询,分布式系统 gStore(分布式

版本,目前未开源)具有非常好的可扩展性,根据“中国软件测评中心”给出的测

试报告显示,分布式 gStore 系统在百亿规模的 RDF 三元组数据集上具有秒级查

询时间(详见第 15 章)。

gStore 系统在 Github 上开源以来,一直采用开源社区中广泛使用的 BSD 3-

Clause 开源协议,以促进 gStore 相关知识图谱技术生态的建设。根据该协议,我

们要求使用者在充分需要尊重代码作者的著作权前提下,允许使用者自由的修改

和重新发布代码,也允许使用者在 gStore 代码基础上自由地开发商业软件,以及

发布和销售;但是以上的前提是必须满足第 14 章“法律条款”中,根据 BSD 3-

Clause 开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

布的基于 gStore 代码基础上开发的软件上标有“powered by gStore”和 gStore 标识

(标识参考第 12 章)。我们强烈建议使用者在使用 gStore 前,仔细阅读第 11 章

“法律条款”中有关规定。

Page 8: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

4

二、 快速浏览

后续更新

Page 9: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

5

三、 安装指南

3.1 系统要求

项目 需求

操作系统 Linux, 例如 CentOS, Ubuntu 等

架构 x86_64

磁盘容量 根据数据集的大小

内存大小 根据数据集的大小

glibc 必须安装 version >= 2.14

gcc 必须安装 version >= 4.8

g++ 必须安装 version >= 4.8

make 必须安装

boost 必须安装 version >= 1.54

readline 必须安装

readline-devel 必须安装

libcurl-devel 必须安装

openjdk 如果使用 Java api,则需要

openjdk-devel 如果使用 Java api,则需要

requests 如果使用 Python http api,则需要

node 如果使用 Nodejs http api 则需要

version >=10.9.0

curl-devel 如果使用 php http api,则需要

pthreads 如果使用 php http api,则需

realpath 如果使用 gconsole,则需要

ccache 可选,用于加速编译

3.2 安装环境准备

3.2.1 zip/unzip 安装

判断 zip/unzip 是否安装

yum list installed | grep unzip (centos 系统)

dpkg -s unzip (ubuntu 系统)

如果没有安装,则安装

sudo yum install -y unzip zip (centos 系统)

sudo apt-get install unzip zip (ubuntu 系统)

Page 10: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

6

3.2.2 jdk 安装

判断 jdk 是否安装

java –version

如果没有安装,则安装

sudo yum install java-1.8.0-openjdk-devel.x86_64 (centos 系统)

sudo apt-get install openjdk-8-jdk (ubuntu 系统)

3.2.3 gc++安装

判断 gc++是否安装

yum list installed |grep gcc-c++ (centos 系统)

dpkg -s gcc-c++ (ubuntu 系统)

如果没有安装,则安装

sudo yum install gcc-c++ (centos 系统)

sudo apt-get install gcc (ubuntu 系统)

sudo apt-get install g++ (ubuntu 系统)

3.2.4 readline 安装

判断 readline 是否安装

yum list installed |grep readline (centos 系统)

dpkg -s readline (ubuntu 系统)

如果没有安装,则安装

sudo yum install readline-devel (centos 系统)

sudo apt-get install libreadline-dev (ubuntu 系统)

3.2.5 boost 库安装

判断 boost 是否安装

yum list installed |grep boost (centos 系统)

dpkg -s boost (ubuntu 系统)

Page 11: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

7

如果没有安装,则安装:

版本:1.54.0

地址:https://nchc.dl.sourceforge.net/project/boost/boost/1.54.0/boost_1_54_0.tar.gz

centos boost 库默认版本为 1.53.0,需要按照下面安装脚本安装 boost_1_54_0 或

以上版本。

安装脚本: (centos 系统)

wget https://nchc.dl.sourceforge.net/project/boost/boost/1.54.0/boost_1_54_0.tar.gz

tar -xzvf boost_1_54_0.tar.gz

cd boost_1_54_0

./bootstrap.sh

./b2

./b2 install

然 后 需 要 在 `/etc/profile` 文 件 最 后 加 上 `export

LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH` , 之 后 执 行 `source

/etc/profile` 更新环境。

ubuntu 系统可以直接用 `sudo apt-get install libboost-all-dev` 安装

3.2.6 curl 库安装

判断 readline 是否安装

yum list installed |grep curl (centos 系统)

dpkg -s curl (ubuntu 系统)

如果没有安装,则安装:

版本:7.55.1

地址:https://curl.haxx.se/download/curl-7.55.1.tar.gz

安装脚本 (centos 系统和 ubuntu 系统一样)

wget https://curl.haxx.se/download/curl-7.55.1.tar.gz

tar -xzvf curl-7.55.1.tar.gz

cd curl-7.55.1

./configure

make

Page 12: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

8

make install

或者直接用下面命令安装:

sudo yum install libcurl-devel (centos 系统)

sudo apt-get install libcurl4 libcurl4-openssl-dev (ubuntu 系统)

3.3 gStore 获取

如果遇到权限问题,要在命令前加 sudo。

3.3.1 download

打开 github,地址为`https://github.com/pkumod/gStore`

下载 gStore.zip

解压 zip 包

3.3.2 clone(推荐)

打开 github 网站

获取 git 地址

通过如下命令 clone

git clone https://github.com/pkumod/gStore.git

注意:如果你电脑没有安装 git 的话,需要安装 git

sudo yum install git (centos 系统)

sudo apt-get install git (ubuntu 系统)

3.4 gStore 编译

切换到 gStore 目录下

cd gStore

执行如下指令 (!!注意:需要两次`make`)

Page 13: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

9

make pre

make (比较慢,如果编译正确最后会出现 Compilation ends successfully!结

果)

make (第二次 make,如果正确最后出现 Compilation ends successfully!结果)

bin/ginit (初始化,如果正确最后出现 system.db is built successfully!结果)

3.5 gStore 安装成功!

Page 14: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

10

四、 如何使用

**gStore 的所有命令都应该在 gStore 的根目录中使用,比如 bin/gconsole,因为

可执行文件放在 bin/中,它们可能会使用一些路径在代码中指示的文件,而不是

绝对路径。我们将通过要求用户在他们自己的系统中给出绝对路径来真正安装/

配置 gStore 来确保所有路径都是绝对的。但是,您必须按照我们现在的说法来

避免错误。**

4.1 数据格式

RDF 数据应以 N-Triple 格式提供(现在不支持 XML),并且必须以

SPARQL1.1 语法提供查询。N-Triple 格式文件示例如下:

@prefix foaf: <http://xmlns.com/foaf/0.1/> .

_:a foaf:name "Johnny Lee Outlaw" .

_:a foaf:mbox <mailto:[email protected]> .

_:b foaf:name "Peter Goodguy" .

_:b foaf:mbox <mailto:[email protected]> .

_:c foaf:mbox <mailto:[email protected]> .

关于 N-Triple 文件更详细的描述请参考[N-Triple](https://www.w3.org/TR/n-

triples/)。并非 SPARQL1.1 中的所有语法都是在 gStore 中解析和回答的,例如,

属性路径超出了 gStore 系统的能力。

4.2 gbuild

只要下载并编译 gStore 系统的代码,就会自动创建一个名为 system(真实目

录名称 system.db)的数据库。这是管理系统统计信息的数据库,包括所有用户和

所有数据库。您可以使用 gquery 命令查询此数据库,但禁止使用编辑器对其进

行修改。

gbuild 用于从 RDF 格式文件构建新数据库。

` bin/gbuild db_name rdf_triple_file_path`

例如,我们从 lubm.nt 构建一个数据库,可以在数据文件夹中找到。

[bookug@localhost gStore]$ bin/gbuild lubm ./data/lubm/lubm.nt

gbuild...

argc: 3 DB_store:lubm RDF_data: ./data/lubm/lubm.nt

begin encode RDF from : ./data/lubm/lubm.nt ...

注意:

Page 15: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

11

- 您不应该构建一个空数据库,因为这会导致问题。

4.3 gquery

gquery 用于使用包含 SPARQL 查询的文件查询现有数据库。(每个文件包含

一个精确的 SPARQL 查询)

1.执行从名为 db_name 的数据库中的 query_file 检索的 SPARQL 查询,输入以下

命令:

bin/gquery db_name query_file

2.了解 gquery 使用的详细信如何使用,可以输入以下命令进行查看:

bin/gquery --help

输入命令后,我们可以看到如下结果:

(base) [root@iz8vb0u9hafhzz1mn5xcklz gStore] bin/gquery --help

the current settings are as below:

key : value

------------------------------------------------------------

BackupTime : 2000 4 am (GMT+8)

buffer_maxium : 100

db_home : .

db_suffix : .db

debug_level : simple

gstore_mode : single

operation_logs : true

thread_maxium : 1000

/*=============================================

================================

Filename: gquery.cpp

Author: Bookug Lobert

Mail: [email protected]

Last Modified: 2015-10-20 12:23

Description: query a database, there are several ways to use this program:

1. ./gquery print the help message

2. ./gquery --help simplified as -h, equal to 1

3. ./gquery db_folder query_path load query from given path fro given

database

4. ./gquery db_folder load the given database and open console

=========================================================

Page 16: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

12

====================*/

3.进入 gquery 控制台命令:

bin/gquery db_name

程序显示命令提示符(“gsql>”),您可以在此处输入命令,使用`help`看到所有

命令的基本信息,输入 `quit` 以退出 gquery 控制台。对于`sparql` 命令, 输入包含

单个 SPARQL 查询的文件路径。(支持重定向到文件的答案)

当程序完成回答查询时,它会再次显示命令提示符。gStore2.0 现在只支持简单的

“选择”查询(不支持谓词)。

我们也以 lubm.nt 为例。

(base) [root@iz8vb0u9hafhzz1mn5xcklz gStore] bin/gquery lubm

the current settings are as below:

key : value

------------------------------------------------------------

BackupTime : 2000 4 am (GMT+8)

buffer_maxium : 100

db_home : .

db_suffix : .db

debug_level : simple

gstore_mode : single

operation_logs : true

thread_maxium : 1000

gquery...

argc: 2 DB_store:lubm

load Stirng Prefix

load String Prefix end

get important pre ID

total preID num is 17

important pre ID is: 0 1 13

get candidate preID...

finish getting candidate preID, the size is 0

now add cache of preID2values...

get important subID...

finish getting important subID, the cache size is 0

now add cache of subID2values...

get important objID...

finish getting important objID, the cache size is 0

now add cache of objID2values...

Page 17: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

13

Value File Preload used 0 ms

finish load

triple num: 99550

pre num: 17

entity num: 28413

literal num: 0

finish loading

Type `help` for information of all commands

Type `help command_t` for detail of command_t

gsql>help

help - print commands message

quit - quit the console normally

sparql - load query from the second argument

gsql>quit

注意:

- 如果没有答案,将打印“[empty result]”,并且在所有结果后面都有一个空行。

- 使用 readline lib,因此您可以使用键盘中的箭头键查看命令历史记录,并使用

和箭头键移动和修改整个命令。

- 实用程序支持路径完成。(不是内置命令完成)

- 要将结果输出到磁盘文件,在控制台中使用 `sparql ${YOUR_QUERY} >

${YOUR_FILE}`。

4.4 ghttp

ghttp 像端口 9000 的 HTTP 服务器一样运行 gStore(你需要在你的环境中打

开这个端口,iptables 建议使用工具)。使用规定的 url 从浏览器访问,然后 gStore

将执行相应的操作。

类型:

`bin/ghttp db_name serverPort` 或者 `bin/ghttp serverPort db_name` 使用 serverPort

启动服务器并最初加载名为 db_name 的数据库。

注意:可以省略参数 serverPort 或 db_name

如果省略 commond 中的参数 serverPort,则相应的值将设置为默认值 9000。

如果你在 commond 中省略了参数 db_name,那么服务器将在没有加载数据库的

情况下启动。

Page 18: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

14

操作:build, load, unload, user, showUser, query, drop, monitor, show, checkpoint,

getCoreVersion, getAPIVersion

// initialize

GstoreConnector gc("127.0.0.1", 9000, "root", "123456");

// build a new database by a RDF file.

gc.build("lubm", "data/lubm/lubm.nt");

// load the database that you built.

gc.load("lubm");

//add a user(with username: Jack, password: 2)

gc.user("add_user", "Jack", "2");

//add privilege to user Jack(add_query, add_load, add_unload)

gc.user("add_query", "Jack", "lubm");

//delete privilege of a user Jack(delete_query, delete_load, delete_unload)

gc.user("delete_query", "Jack", "lubm");

//delete user(with username: Jack, password: 2)

gc.user("delete_user", "Jack", "2");

// show all users

gc.showUser();

// query

res = gc.query("lubm", "json", sparql);

std::cout << res << std::endl;

// save updates of a loaded database

gc.checkpoint("lubm");

// show statistical information of a loaded database

gc.monitor("lubm");

// show all databases already built and if they are loaded

gc.show();

// unload this database.

gc.unload("lubm");

Page 19: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

15

// drop a database already built completely.

gc.drop("lubm", false);

// drop a database already built but leave a backup.

gc.drop("lubm", true);

// get CoreVersion and APIVersion

gc.getCoreVersion();

gc.getAPIVersion();

db_name: the name of database, like lubm

format: html, json, txt, csv

sparql: select ?s where { ?s ?p ?o . }

ds_path in the server: like /home/data/test.n3

operation: the type of operation: like load, unload, query ...

type: the type of operation that you execute on user, like: add_user, delete_user,

add_query, add_load...

username: the username of the user that execute the operation

password: the password of the user that execute the operation

`ghttp` 支持 GET 和 POST 请求类型。

`ghttp` 持并发只读查询,但是当包含更新的查询到来时,整个数据库将被锁定。

在具有数十个内核线程的计算机上,建议并发运行查询的数量低于 300,但我们

可以在实验中同时运行 13000 个查询。要使用并发功能,最好将“打开文件”和“最

大进程”的系统设置修改为 65535 或更大。

在[安装程序](../scripts/setup/) 中放置了三个脚本,以帮助您修改不同 Linux 发行

版中的设置。

**如果通过发送包含更新的查询`ghttp`, 您最好经常向控制台发送`checkpoint`

命令 `ghttp` 。 否则,更新可能无法与磁盘同步,并且如果 `ghttp` 服务器异

常停止则会丢失(例如,键入“Ctrl + C”)**

**注意:你最好不要只需输入命令“Ctrl + C”来停止 ghttp,因为这不安全。

** 为了停止 ghttp 服务器,您可以输入 `bin/shutdown serverPort`

4.5 gserver

gserver 是一个守护进程。它应该在通过 gclient 或 API 访问 gStore 时首先启

动。它通过 socket 与客户端通信。

Page 20: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

16

[bookug@localhost gStore]$ bin/gserver -s

Server started at port 3305.

您还可以指定自定义端口进行收听。

[bookug@localhost gStore]$ bin/gserver -s -p 3307

Server started at port 3307.

您可以通过以下方式停止服务器:

[bookug@localhost gStore]$ bin/gserver -t

Server stopped at port 3305.

注意:gserver 不支持多个线程。如果你同时在多个终端启动 gclient,gserver 将

会关闭。

4.6 gclient

gclient 被设计为发送命令和接收反馈的客户端。

[bookug@localhost gStore]$ bin/gclient

ip=127.0.0.1 port=3305

gsql>

您还可以分配 gserver 的 ip 和端口。

[bookug@localhost gStore]$ bin/gclient 172.31.19.15 3307

ip=172.31.19.15 port=3307

gsql>

我们现在可以使用以下命令:

- `help` 显示所有命令的信息

- `import db_name rdf_triple_file_name` 从 RDF 三重文件构建数据库

- `load db_name` 加载现有数据库

- `unload db_name` 卸载数据库,但不会在磁盘上删除它,您可以在下次加载它

- `sparql "query_string"` 使用 SPARQL 查询字符串查询当前数据库(引用“”)

- `show` 显示当前加载的数据库的名称

Page 21: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

17

注意:

- 最多可以在 gclient 控制台中加载一个数据库

- 你可以在命令的不同部分之间放置''或'\ t',但不能使用像';'这样的字符

- 你不应该在任何命令开始之前放置任何空格或制表符

4.7 gconsole

只需在 gStore 的根目录键入`bin/gconsole`即可使用此控制台,您将找到一个

`gstore>`提示,指示您处于原始模式并且现在可以键入本机命令。此控制台还有

另一种模式,称为远程模式。只需在原始模式下输入`connect`进入远程模式,然

后键入`disconnect`退出到本机模式。(控制台连接到其 IP 为'127.0.0.1'且端口为

3305 的 gStore 服 务 器 , 您 可 以 按 类 型 指 定 `connect gStore_server_ip

gStore_server_port`)

您可以使用`help`或`?`以本机模式或远程模式查看帮助信息,也可以键入`help

command_name`或`? command_name`查看给定命令的信息。请注意,本机模式下

的命令与远程模式下的命令之间存在一些差异。例如,系统命令,如`ls`,`cd`和

`pwd`在本地模式下被提供,而不是在远程模式。另外请注意,并非帮助页面中

包含的所有命令都已完全实现,我们将来可能会更改控制台的某些功能。

我们所做的就足以为您提供使用 gStore 的便利,享受吧!

4.8 gadd

gadd 用于将文件中的三元组插入现有数据库。

用法:bin / gadd db_name rdf_triple_file_path

[bookug@localhost gStore]$ bin/gadd lubm ./data/lubm/lubm.nt

...

argc: 3 DB_store:lubm insert file:./data/lubm/lubm.nt

get important pre ID

...

insert rdf triples done.

inserted triples num: 99550

Page 22: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

18

4.9 gsub

gsub 用于从现有数据库中删除文件中的三元组。

用法:bin / gsub db_name rdf_triple_file_path

[bookug@localhost gStore]$ bin/gsub lubm ./data/lubm/lubm.nt

...

argc: 3 DB_store:lubm remove file: ./data/lubm/lubm.nt

...

remove rdf triples done.

removed triples num: 99550

4.10 gmonitor

gmonitor 用于检查 gStore 的数据库 db_name 的当前状态。

用法:bin/gmonitor db_name

[bookug@localhost gStore]$ bin/gmonitor lubm

database: lubm

creator: root

built_time: "2019-07-28 10:27:24"

triple num: 99550

entity num: 28413

literal num: 0

subject num: 14569

predicate num: 17

4.11 gshow

gshow 用于检查已加载的数据库。

用法:bin/gshow

[bookug@localhost gStore]$ bin/gshow

========================================

database: system

creator: root

built_time: "2019-07-28 10:26:00"

========================================

Page 23: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

19

database: lubm

creator: root

built_time: "2019-07-28 10:27:24"

4.12 gdrop

为了删除数据库,您不应该只是键入`rm -r db_name.db`因为这不会更新名为

的内置数据库`system`。相反,你应该输入`bin/gdrop db_name`。

4.13 gexport

gexport 用于将数据库导出成.nt 文件。

bin/gexport db_name 导出数据库至 gStore 根目录下:

(base) [root@iz8vb0u9hafhzz1mn5xcklz gStore]# bin/gexport lubm

after Handle, used 0 ms.

QueryCache didn't cache

after tryCache, used 0 ms.

in getFinal Result the first half use 0 ms

after getFinalResult, used 0ms.

Total time used: 1ms.

finish exporting the database.

bin/gexport db_name path 导出数据库至指定路径:

(base) [root@iz8vb0u9hafhzz1mn5xcklz gStore]# bin/gexport lubm ./exportdata

after Handle, used 0 ms.

QueryCache didn't cache

after tryCache, used 0 ms.

in getFinal Result the first half use 0 ms

after getFinalResult, used 0ms.

Total time used: 1ms.

finish exporting the database.

4.14 shutdown

启动 ghttp 后,键入`bin/shutdown port`以停止服务器而不是简单地键入命令

“Ctrl + C”。

Page 24: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

20

4.15 ginit

如果要还原 ghttp 服务器的初始配置,请键入`bin/ginit`以重建 system.db。

bin/ginit -d [db_name1] [db_name2] …… [db_name] 将输入的数据库信息在

初始化时导入系统库。

4.16 test utilities

一系列的测试程序被放置在在 scripts/文件夹中,我们将介绍几种有用的:

`full_test.sh`,`basic_test.sh`,`update_test.cpp`,`parser_test.sh`,`dataset_test.cpp`

和`gtest.cpp`。

**`full_test.sh` 用于比较多个数据集和查询上 gStore 和其他数据库系统的性能。

**

要使用`full_test.sh`实用程序,请下载要测试和比较的数据库系统,并在此脚本中

设置数据库系统和数据集的确切位置。名称策略应该与 gtest 的要求以及日志策

略相同。

在此脚本中只测试和比较 gStore 和 Jena,但如果您想花一些时间阅读此脚本,则

很容易添加其他数据库系统。如果遇到问题,您可以去[测试报告](pdf/gstore 测

试报告.pdf) 或者 [常见问题](FAQ.md) 寻求帮助。

**`basic_test.sh` 用于验证几个小数据集上建库/查询/增添/删除/删库的正确性。

**

只需运行`bash scripts/basic_test.sh`即可使用此脚本。

建议您在每次添加一些修改并再次编译后完成此验证(包括使用更新代码的情况

`git pull`)。

**`update_test.cpp` 用于验证重复插入/删除的正确性。**

在用`make`编译整个项目后,可以在`scripts/`目录下找到可执行文件`update_test`。

运行`scripts/update_test > /dev/null`以完成此测试,您将看到最后的输出指示是否

成功。

默认情况下,此命令将测试 10000 组插入/删除和每组 1-5 个三元组。要更改组编

号和组大小,您可以按以下方式运行:

bin/update_test ${YOUR_GROUP_NUMBER} > /dev/null

Page 25: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

21

bin/update_test ${YOUR_GROUP_NUMBER} ${YOUR_GROUP_SIZE} >

/dev/null

**`parser_test.sh` 用于验证解析器的正确性。**

只需运行`bash scripts/parser_test.sh`即可使用此脚本。

事实上, `make test` 命令将顺序进行上述三个测试。 (`basic_test.sh` ,

`update_test.cpp`和`parser_test.sh`)

**`dataset_test.cpp` 用于验证几个大数据集上的构建/查询的正确性。**

如果要在大数据集上测试构建/查询的正确性,那么在`make`编译整个项目后,将

在`scripts/`目录下找到可执行文件`dataset_test`。

运行 `scripts/dataset_test ${DB_NAME} ${DATASET_PATH} ${QUERY_PATH}

${ANSWER_PATH}> /dev/null`以完成此测试,您将看到最后的输出指示是否成

功。

注意:

- 您应该以这种方式放置查询和答案:

${YOUR_DATA_PATH}*.sql

${YOUR_DATA_PATH}*.txt

- $ {QUERY_PATH}和$ {ANSWER_PATH}需要以'/'结尾。

- 查询及其答案需要具有相同的名称,例如 q0.sql 和 q0.txt。

**gtest 用于测试具有多个数据集和查询的 gStore。**

要使用 gtest 实用程序,请先键入`make gtest`以编译 gtest 程序。程序 gtest 是一

种为数据集生成结构日志的测试工具。请输入`./gtest --help`工作目录了解详情。

**如果需要,请更改 test / gtest.cpp 中的路径。**

您应该以这种方式放置数据集和查询:

DIR/WatDiv/database/*.nt

Page 26: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

22

DIR/WatDiv/query/*.sql

请注意,DIR 是您放置等待 gtest 使用的所有数据集的根目录。而 WatDiv 是一

类数据集,以及 lubm。在 WatDiv 内部(或 lubm 等,请将所有数据集(以.nt 命

名)放在数据库/文件夹中,并将所有查询(对应于以.sql 命名的数据集)放在查

询文件夹中。

然后,您可以使用指定的参数运行 gtest 程序,输出将分为 gStore 根目录中的

三个日志:load.log /(用于数据库加载时间和大小),time.log /(用于查询时间)

和结果。 log /(对于所有查询结果,不是整个输出字符串,而是记录所选择的两

个数据库系统匹配与否的信息)。

该程序生成的所有日志都是 TSV 格式(用'\ t'分隔),您可以直接将它们加载到

Calc / Excel / Gnumeric 中。请注意,时间单位是 ms,空格单位是 kb。

Page 27: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

23

五、 API 使用

本手册将指导您使用我们的 API 访问 gStore。本手册主要说明的是 HTTP

API。HTTP API 更稳定、更标准,可以维护连接。socket API 不能保证正确的传

输,所以网络传输更快。

我们现在为 ghttp 提供 c++、java、python、php 和 nodejs API。请参考

`api/http/cpp`、`api/http/java`、`api/http/python`、`api/http/php`和`api/http/nodejs`中

的示例代码。要使用这些示例,请确保已经生成了可执行文件。接下来,使用

`bin/ghttp`命令启动 ghttp 服务。如果您知道一个正在运行的可用 ghttp 服务器,

并尝试连接到它,这是可以的。(如果使用示例,则不需要更改任何内容,只是默

认情况下)。然后,对于 c++和 java 代码,您需要编译目录`api/http/cpp/example`

和`api/http/java/example`中的示例代码。

API 结构

gStore 的 HTTP API 放在 gStore 根目录的 API / HTTP 目录中,其内容如下:

- gStore/api/http/

- cpp/ (the C++ API)

- client.cpp (C ++ API 的源代码)

- client.h

- example/ (显示使用 C ++ API 的基本思想的小示例程序)

- GET-example.cpp

- Benchmark.cpp

- POST-example.cpp

- Makefile

- Makefile (编译和构建 lib)

- java/ (the Java API)

- client.java

- lib/

- src/

- Makefile

Page 28: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

24

- jgsc/

- GstoreConnector.java

- example/

- Benckmark.java

- GETexample.java

- POSTexample.java

- Makefile

- python/ (the Python API)

- example/

- Benchmark.py

- GET-example.py

- POST-example.py

- src/

- GstoreConnector.py

- nodejs/ (the Nodejs API)

- GstoreConnector.js (Nodejs API 的源代码)

- LICENSE

- package.json

- README.md

- example/ (显示使用 Nodejs API 的基本思路的小例子)

- POST-example.js

- GET-example.js

Page 29: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

25

- php/ (the Php API)

- example/

- Benchmark.php

- POST-example.php

- GET-example.php

- src/

- GstoreConnector.php

5.1 C++ API

接口

要使用 C ++ API,请将该短语`include "client.h"`放在 cpp 代码中。client.h 中的函

数应该调用如下:

// initialize

GstoreConnector gc("127.0.0.1", 9000, "root", "123456");

// build a new database by a RDF file.

// note that the relative path is related to the server

gc.build("lubm", "data/lubm/lubm.nt");

// load the database that you built.

gc.load("lubm");

// to add, delete a user or modify the privilege of a user, operation must be done by

the root user

gc.user("add_user", "user1", "111111");

// show all users

gc.showUser();

// query

std::string res = gc.query("lubm", "json", sparql);

std::cout << res << std::endl;

Page 30: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

26

// query and save the result in a file called "ans.txt"

gc.fquery("lubm", "json", sparql, "ans.txt");

// save the database if you have changed the database

gc.checkpoint("lubm");

// show information of the database

gc.monitor("lubm");

// show all databases

gc.show();

// unload this database.

gc.unload("lubm");

// also, you can load some exist database directly and then query.

gc.load("lubm");

res = gc.query("lubm", "json", sparql);

std::cout << res << std::endl;

gc.unload("lubm");

// drop the database directly

gc.drop("lubm", false);

// drop the database and leave a backup

gc.drop("lubm", true);

// get CoreVersion and APIVersion

gc.getCoreVersion();

gc.getAPIVersion();

这些功能的原始声明如下:

If request_type is "GET", the last parameter can be omitted:

GstoreConnector(std::string serverIP, int serverPort, std::string username,

std::string password);

std::string build(std::string db_name, std::string rdf_file_path, std::string

request_type);

Page 31: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

27

std::string load(std::string db_name, std::string request_type);

std::string unload(std::string db_name, std::string request_type);

std::string user(std::string type, std::string username2, std::string addition,

std::string request_type);

std::string showUser(std::string request_type);

std::string query(std::string db_name, std::string format, std::string sparql,

std::string request_type);

std::string drop(std::string db_name, bool is_backup, std::string request_type);

std::string monitor(std::string db_name, std::string request_type);

std::string checkpoint(std::string db_name, std::string request_type);

std::string show(std::string request_type);

std::string getCoreVersion(std::string request_type);

std::string getAPIVersion(std::string request_type);

void fquery(std::string db_name, std::string format, std::string sparql, std::string

filename, std::string request_type);

5.2 Java API

接口

要使用 Java API,请参阅 gStore/api/http/java/src/jgsc/GstoreConnector.java。应该

像下面这样调用函数:

// initialize

GstoreConnector gc = new GstoreConnector("127.0.0.1", 9000, "root", "123456");

// build a new database by a RDF file.

// note that the relative path is related to the server

gc.build("lubm", "data/lubm/lubm.nt");

// load the database that you built.

gc.load("lubm");

Page 32: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

28

// to add, delete a user or modify the privilege of a user, operation must be done by

the root user

gc.user("add_user", "user1", "111111");

// show all users

gc.showUser();

// query

String res = gc.query("lubm", "json", sparql);

System.out.println(res);

// query and save the result in a file called "ans.txt"

gc.fquery("lubm", "json", sparql, "ans.txt");

// save the database if you have changed the database

gc.checkpoint("lubm");

// show information of the database

gc.monitor("lubm");

// show all databases

gc.show();

// unload this database.

gc.unload("lubm");

// also, you can load some exist database directly and then query.

gc.load("lubm");

res = gc.query("lubm", "json", sparql);

System.out.println(res);

gc.unload("lubm");

// drop the database directly

gc.drop("lubm", false);

// drop the database and leave a backup

gc.drop("lubm", true);

// get CoreVersion and APIVersion

gc.getCoreVersion();

gc.getAPIVersion();

这些功能的原始声明如下:

Page 33: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

29

If request_type is "GET", the last parameter can be omitted:

public class GstoreConnector(String serverIP, int serverPort, String username,

String password);

public String build(String db_name, String rdf_file_path, String request_type);

public String load(String db_name, String request_type);

public String unload(String db_name, String request_type);

public String user(String type, String username2, String addition, String

request_type);

public String showUser(String request_type);

public String query(String db_name, String format, String sparql, String

request_type);

public void fquery(String db_name, String format, String sparql, String filename,

String request_type);

public String drop(String db_name, boolean is_backup, String request_type);

public String monitor(String db_name, String request_type);

public String checkpoint(String db_name, String request_type);

public String show(String request_type);

public String getCoreVersion(String request_type);

public String getAPIVersion(String request_type);

5.3 Python API

接口

要使用 Python API,请参阅 gStore/api/http/python/src/GstoreConnector.py。应该调

用函数如下:

Page 34: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

30

start a gc with given IP, Port, username and password

gc = GstoreConnector.GstoreConnector("127.0.0.1", 9000, "root", "123456")

build a database with a RDF graph

res = gc.build("lubm", "data/lubm/lubm.nt")

load the database

res = gc.load("lubm")

to add, delete a user or modify the privilege of a user, operation must be done by

the root user

res = gc.user("add_user", "user1", "111111")

show all users

res = gc.showUser()

query

res = gc.query("lubm", "json", sparql)

print(res)

query and save the result in a file called "ans.txt"

gc.fquery("lubm", "json", sparql, "ans.txt")

save the database if you have changed the database

res = gc.checkpoint("lubm")

show information of the database

res = gc.monitor("lubm")

show all databases

res = gc.show()

unload the database

res = gc.unload("lubm")

drop the database directly

res = gc.drop("lubm", False)

drop the database and leave a backup

res = gc.drop("lubm", True)

get CoreVersion and APIVersion

res = gc.getCoreVersion();

res = gc.getAPIVersion();

Page 35: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

31

这些功能的原始声明如下:

If request_type is "GET", the last parameter can be omitted:

public class GstoreConnector(self, serverIP, serverPort, username, password):

def build(self, db_name, rdf_file_path, request_type):

def load(self, db_name, request_type):

def unload(self, db_name, request_type):

def user(self, type, username2, addition, request_type):

def showUser(self, request_type):

def query(self, db_name, format, sparql, request_type):

def fquery(self, db_name, format, sparql, filename, request_type):

def drop(self, db_name, is_backup, request_type):

def monitor(self, db_name, request_type):

def checkpoint(self, db_name, request_type):

def show(self, request_type):

def getCoreVersion(self, request_type):

def getAPIVersion(self, request_type):

5.4 Nodejs API

接口

在使用 Nodejs API 之前,键入`npm install request`并`npm install request-promise`

在 nodejs 文件夹下添加所需的模块。

要使用 Nodejs API,请参阅 gStore/api/http/nodejs/GstoreConnector.js。应该调用函

数如下:

Page 36: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

32

// start a gc with given IP, Port, username and password

gc = new GstoreConnector("127.0.0.1", 9000, "root", "123456");

// build a database with a RDF graph

res = gc.build("lubm", "data/lubm/lubm.nt");

// load the database

res = gc.load("lubm");

// to add, delete a user or modify the privilege of a user, operation must be done by

the root user

res = gc.user("add_user", "user1", "111111");

// show all users

res = gc.showUser();

// query

res = gc.query("lubm", "json", sparql);

console.log(JSON.stringify(res,","));

// save the database if you have changed the database

res = gc.checkpoint("lubm");

// show information of the database

res = gc.monitor("lubm");

// show all databases

res = gc.show();

// unload the database

res = gc.unload("lubm");

// drop the database directly

res = gc.drop("lubm", false);

// drop the database and leave a backup

res = gc.drop("lubm", true);

// get CoreVersion and APIVersion

res = gc.getCoreVersion();

res = gc.getAPIVersion();

Page 37: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

33

这些功能的原始声明如下:

If request_type is "GET", the last parameter can be omitted:

class GstoreConnector(ip = '', port, username = '', password = '');

async build(db_name = '', rdf_file_path = '', request_type);

async load(db_name = '', request_type);

async unload(db_name = '', request_type);

async user(type = '', username2 = '' , addition = '' , request_type);

async showUser(request_type);

async query(db_name = '', format = '' , sparql = '' , request_type);

async drop(db_name = '', is_backup , request_type);

async monitor(db_name = '', request_type);

async checkpoint(db_name = '', request_type);

async show(request_type);

async getCoreVersion(request_type);

async getAPIVersion(request_type);

5.5 Php API

接口

要使用 Php API,请参阅 gStore/api/http/php/src/GstoreConnector.php。应该调用函

数如下:

// start a gc with given IP, Port, username and password

$gc = new GstoreConnector("127.0.0.1", 9000, "root", "123456");

// build a database with a RDF graph

$res = $gc->build("lubm", "data/lubm/lubm.nt");

echo $res . PHP_EOL;

Page 38: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

34

// load rdf

$ret = $gc->load("test", $username, $password);

echo $ret . PHP_EOL;

// to add, delete a user or modify the privilege of a user, operation must be done by

the root user

//$res = $gc->user("add_user", "user1", "111111");

//echo $res . PHP_EOL;

// show all users

$res = $gc->showUser();

echo $res. PHP_EOL;

// query

$res = $gc->query("lubm", "json", $sparql);

echo $res. PHP_EOL;

// query and save the result in a file called "ans.txt"

$gc->fquery("lubm", "json", $sparql, "ans.txt");

// save the database if you have changed the database

$res = $gc->checkpoint("lubm");

echo $res. PHP_EOL;

// show information of the database

$res = $gc->monitor("lubm");

echo $res. PHP_EOL;

// show all databases

$res = $gc->show();

echo $res. PHP_EOL;

// unload the database

$res = $gc->unload("lubm");

echo $res. PHP_EOL;

// drop the database directly

$res = $gc->drop("lubm", false);

echo $res. PHP_EOL;

// drop the database and leave a backup

$res = $gc->drop("lubm", true);

echo $res. PHP_EOL;

Page 39: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

35

// get CoreVersion and APIVersion

$res = $gc->getCoreVersion();

echo $res. PHP_EOL;

$res = $gc->getAPIVersion();

echo $res. PHP_EOL;

这些功能的原始声明如下:

If request_type is "GET", the last parameter can be omitted:

class GstoreConnector($ip, $port, $username, $password)

function build($db_name, $rdf_file_path, $request_type)

function load($db_name, $request_type)

function unload($db_name, $request_type)

function user($type, $username2, $addition, $request_type)

function showUser($request_type)

function query($db_name, $format, $sparql, $request_type)

function fquery($db_name, $format, $sparql, $filename, $request_type)

function drop($db_name, $is_backup, $request_type)

function monitor($db_name, $request_type)

function checkpoint($db_name, $request_type)

function show($request_type)

function getCoreVersion($request_type)

function getAPIVersion($request_type)

Page 40: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

36

六、 workbench 使用

6.1 登录

- 登录网址为:http://39.98.246.244/gStoreMS/views/user/login.html

- 设置远端 ip 和端口保存到远端的 gStore 图数据库管理系统

- 输入用户名、密码和验证码登录到已保存服务器上的 gStore 图数据库管理系统

6.2 用户功能

**在网站右上角用户可以**

- 调整界面配色

- 全屏操作

Page 41: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

37

- 查看、更改用户基本资料和密码

- 退出 gStore 图数据库管理系统

- 提供数据库信息以及进入官网链接

Page 42: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

38

6.3 查询功能

**网站左边**

6.3.1 主页

- 首页:查看 gStore 介绍和使用文档

Page 43: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

39

6.3.2 数据库

6.3.2.1 数据库管理

- 查看已加载数据库的信息

- 新建数据库

6.3.2.2 图数据库查询

- 选择要查询的数据库

- 按照 sparql 文档输入查询语句,返回结果图和 json 数据文件

Page 44: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

40

6.3.3 用户管理

6.3.3.1 用户列表

显示当前用户列表:

6.3.3.2 授权用户

对用户进行功能授权:

Page 45: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

41

七、 Docker 方式部署 gStore

简单说,我们提供两种方式通过容器部署 gStore:一种是通过项目根目录的

Dockerfile 文件自主构建,然后运行容器。另一种是直接下载已经自动构建完成

的镜像,然后直接运行。

7.1 环境准备

关 于 安 装 使 用 Docker , 参 考 地 址 :

[docker](https://blog.csdn.net/A632189007/article/details/78662741)

7.2 直接拉取镜像运行(推荐)

无需下载项目或自己构建,直接输入`sudo docker pull pkumod/gstore:latest` 拉

取已经在 docker hub 上自动构建完成的镜像。拉取完成后 `sudo docker run -p

9000:80 -it pkumod/gstore:latest ` 即可直接启动并进入容器使用。

7.3 通过 Dockerfile 构建镜像

假设已经拥有正常的 Docker 环境跟网络后,首先通过`git clone ` 下载项目。

然后进入项目根目录,输入命令`make pre `解压一些工具包。输入命令**`sudo

docker build -t gstore .`有问题** 即可开始构建,默认使用根目录的 Dockerfile,

关于具体说明 Dockerfile 文件内也有补充。

构建完成后,直接通过`sudo docker run -p 9000:80 -it gstore` 即可启动并进入

容器执行其他操作。

7.4 后续工作

7.4.1 性能测试

这个待后续补充,容器化跟原生运行 gStore,在不同文件数/网络等情况下,

容器的性能损耗具体比重。。

7.4.2 连接其他容器测试

文档也待后续补充更新

Page 46: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

42

7.4.3 构建精简优化

因为 gcc:8 镜像就有 1.7G 了,自带了很多不必要的东西(包括 go 的环境之

类的),希望后续除了在调低 gcc 版本之外,能对源镜像本身改进出精简版来。

其他可能也有不少需要补充,所以目前只是**抛砖引玉**,添加了一个最基本

的版本。基本的环境构建只是容器化的第一步。

Page 47: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

43

八、 支持 SPARQL 语法介绍

SPARQL 教程的目标是在提供快速的 SPARQL 课程,旨在能够更好的方便

用户利用 gstore 图数据管理系统进行 SPARQL 查询,本教程介绍了 gStore 能够

支持的 SPARQL 查询功能。

8.1 进行简单查询

8.1.1 简单查询

下面的示例,我们将会展示如何使用 gStore 从给定的数据图中查找书籍的

题目。

查询数据集:一个简单的 RDF 三元组数据

<http://example.org/book/book1> <http://purl.org/dc/elements/1.1/title> "SPARQL

Tutorial" .

查询语句:

SELECT ?title

WHERE

{

<http://example.org/book/book1> <http://purl.org/dc/elements/1.1/title> ?title .

}

接下来,在 gStore 上进行 sparql 查询,查询结果:

final result is :

?title

"SPARQL Tutorial"

8.1.2 多重匹配

查询数据集:

@prefix foaf: <http://xmlns.com/foaf/0.1/> .

_:a foaf:name "Johnny Lee Outlaw" .

Page 48: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

44

_:a foaf:mbox <mailto:[email protected]> .

_:b foaf:name "Peter Goodguy" .

_:b foaf:mbox <mailto:[email protected]> .

_:c foaf:mbox <mailto:[email protected]> .

查询语句:

PREFIX foaf: <http://xmlns.com/foaf/0.1/>

SELECT ?name ?mbox

WHERE

{ ?x foaf:name ?name .

?x foaf:mbox ?mbox }

在 gStore 上进行 sparql 查询,查询结果:

final result is :

?name ?mbox

"Johnny Lee Outlaw" <mailto:[email protected]>

"Peter Goodguy" <mailto:[email protected]>

8.1.3 匹配 RDF 文字

查询数据集:

@prefix dt: <http://example.org/datatype> .

@prefix ns: <http://example.org/ns> .

@prefix : <http://example.org/ns> .

@prefix xsd: <http://www.w3.org/2001/XMLSchema> .

:x ns:p "cat"@en .

:y ns:p "42"^^xsd:integer .

:z ns:p "abc"^^dt:specialDatatype .

8.1.3.1 将文字与语言标签相匹配

查询语句 1:

SELECT ?v WHERE { ?v ?p "cat"@en }

在 gStore 上进行 SPARQL 查询得到的结果:

Page 49: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

45

final result is :

?v

<http://example.org/nsx>

8.1.3.2 将文字与数字类型匹配

查询语句 2:

PREFIX xsd: <http://www.w3.org/2001/XMLSchema>

SELECT ?v WHERE { ?v ?p "42"^^xsd:integer }

在 gStore 上进行 SPARQL 查询得到的结果:

final result is :

?v

<http://example.org/nsy>

查询语句 3:

SELECT ?v WHERE { ?v ?p

"42"^^<http://www.w3.org/2001/XMLSchemainteger> }

在 gStore 上进行 SPARQL 查询得到的结果:

final result is :

?v

<http://example.org/nsy>

8.1.3.3 匹配具有任意数据类型的文字

查询语句 4:

SELECT ?v WHERE { ?v ?p

"abc"^^<http://example.org/datatypespecialDatatype> }

在 gStore 上进行 SPARQL 查询得到的结果:

final result is :

?v

<http://example.org/nsz>

Page 50: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

46

查询语句 5:

PREFIX dt: <http://example.org/datatype>

SELECT ?v WHERE { ?v ?p "abc"^^dt:specialDatatype }

在 gStore 上进行 SPARQL 查询得到的结果:

final result is :

?v

<http://example.org/nsz>

8.1.4 空白节点标签

空白节点的表现形式“_:”,本文档中示例结果集中的空白节点以“_:”形式写

入,后跟空白节点标签。

查询数据集:

@prefix foaf: <http://xmlns.com/foaf/0.1/> .

_:a foaf:name "Alice" .

_:b foaf:name "Bob" .

查询语句:

PREFIX foaf: <http://xmlns.com/foaf/0.1/>

SELECT ?x ?name

WHERE { ?x foaf:name ?name }

在 gStore 上进行 SPARQL 查询得到的结果:

final result is :

?x ?name

<_:a> "Alice"

<_:b> "Bob"

Page 51: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

47

8.2 RDF 期限约束(RDF 项约束)

8.2.1 限制字符串的值

SPARQL FILTER 函数可以测试 RDF 文字,正则表达式只匹配字符串文

本,regex 可以通过使用 str 函数来匹配其他文字的词法形式。

查询数据集:

@prefix dc: <http://purl.org/dc/elements/1.1/> .

@prefix : <http://example.org/book/> .

@prefix ns: <http://example.org/ns> .

:book1 dc:title "SPARQL Tutorial" .

:book1 ns:price 42 .

:book2 dc:title "The Semantic Web" .

:book2 ns:price 23 .

查询语句:

PREFIX dc: <http://purl.org/dc/elements/1.1/>

SELECT ?title

WHERE { ?x dc:title ?title

FILTER regex(?title, "^SPARQL")

}

在 gStore 上进行 SPARQL 查询得到的结果:

final result is :

?title

"SPARQL Tutorial"

8.3 包括可选值

基本图模式允许应用程序进行查询,其中整个查询模式必须匹配才能有结果。

8.3.1 可选模式匹配

可选匹配中,可选图模式要么匹配图,从而定义并向一个或多个结果中添加

绑定,要么保持结果不变而不添加任何附加绑定。

假设我们有一个 RDF 三元组数据如下:

Page 52: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

48

@prefix foaf: <http://xmlns.com/foaf/0.1/> .

@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns> .

_:a rdf:type foaf:Person .

_:a foaf:name "Alice" .

_:a foaf:mbox <mailto:[email protected]> .

_:a foaf:mbox <mailto:[email protected]> .

_:b rdf:type foaf:Person .

_:b foaf:name "Bob" .

查询语句为:

PREFIX foaf: <http://xmlns.com/foaf/0.1/>

SELECT ?name ?mbox

WHERE { ?x foaf:name ?name .

OPTIONAL { ?x foaf:mbox ?mbox }

}

在 gStore 上进行 SPARQL 查询得到的结果:

final result is :

name mbox

"Alice" <mailto:[email protected]>

"Alice" <mailto:[email protected]>

"Bob"

在名称为“Bob”的结果中没有 mbox 的值。该查询在数据中查找人名。如果

有一个带有谓词 mbox 的三元组和相同的主题,那么结果也将包含该三元组的对

象。在本例中,查询的可选匹配部分只给出了一个三元模式,但通常,可选部分

可以是任何图形模式。整个可选图形模式必须与可选图形模式匹配,才能影响查

询结果。

8.3.2 可选模式匹配中的约束

约束可以以可选的图模式给出。

例如有 RDF 三元组数据如下:

@prefix dc: <http://purl.org/dc/elements/1.1/> .

@prefix : <http://example.org/book/> .

@prefix ns: <http://example.org/ns> .

:book1 dc:title "SPARQL Tutorial" .

:book1 ns:price 42 .

:book2 dc:title "The Semantic Web" .

Page 53: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

49

:book2 ns:price 23 .

查询语句为:

PREFIX dc: <http://purl.org/dc/elements/1.1/>

PREFIX ns: <http://example.org/ns>

SELECT ?title ?price

WHERE { ?x dc:title ?title .

OPTIONAL { ?x ns:price ?price . FILTER (?price < 30) }

}

sparql 查询结果为:

title price

"SPARQL Tutorial"

"The Semantic Web" 23

在 gStore 上进行 SPARQL 查询得到的结果: (!!不匹配)

final result is :

?title ?price

"SPARQL Tutorial"

"The Semantic Web"

8.3.3 多种可选图模式

图模式是递归定义的。图模式可以有零个或多个可选图模式,查询模式的任

何部分都可以有一个可选部分。在本例中,有两个可选的图模式。

RDF 三元组数据如下:

@prefix foaf: <http://xmlns.com/foaf/0.1/> .

_:a foaf:name "Alice" .

_:a foaf:homepage <http://work.example.org/alice/> .

_:b foaf:name "Bob" .

_:b foaf:mbox <mailto:[email protected]> .

查询语句为:

PREFIX foaf: <http://xmlns.com/foaf/0.1/>

SELECT ?name ?mbox ?hpage

WHERE { ?x foaf:name ?name .

Page 54: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

50

OPTIONAL { ?x foaf:mbox ?mbox } .

OPTIONAL { ?x foaf:homepage ?hpage }

}

在 gStore 上进行 SPARQL 查询得到的结果:

final result is :

?name ?mbox ?hpage

"Alice" <http://work.example.org/alice/>

"Bob" <mailto:[email protected]>

8.4 匹配两个中的一个

SPARQL 提供了一种组合图模式的方法,以便可以匹配几个备选图模式之

一。如果有多个备选方案匹配,则找到所有可能的模式结果。模式替换是用

UNION 关键字在语法上指定的。

下面这一查询在数据中查找图书的标题,无论该标题是使用 1.0 版或 1.1 版

中的 Dublin Core 属性记录的。

假设我们有一个 RDF 三元组数据如下:

@prefix dc10: <http://purl.org/dc/elements/1.0/> .

@prefix dc11: <http://purl.org/dc/elements/1.1/> .

_:a dc10:title "SPARQL Query Language Tutorial" .

_:a dc10:creator "Alice" .

_:b dc11:title "SPARQL Protocol Tutorial" .

_:b dc11:creator "Bob" .

_:c dc10:title "SPARQL" .

_:c dc11:title "SPARQL (updated)" .

查询语句为:

PREFIX dc10: <http://purl.org/dc/elements/1.0/>

PREFIX dc11: <http://purl.org/dc/elements/1.1/>

SELECT ?title

WHERE { { ?book dc10:title ?title } UNION { ?book dc11:title ?title } }

在 gStore 上进行 SPARQL 查询得到的结果:

Page 55: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

51

final result is :

?title

"SPARQL Protocol Tutorial"

"SPARQL"

"SPARQL (updated)"

"SPARQL Query Language Tutorial"

为了准确地确定信息是如何记录的,查询可以对这两种方法使用不同的变量。

下面这一查询将返回结果,其中 x 为 UNION 左分支的解的界,y 为 UNION 右

分支的解的界。如果 UNION 模式的任何部分都不匹配,则图模式将不匹配。

查询语句为:

PREFIX dc10: <http://purl.org/dc/elements/1.0/>

PREFIX dc11: <http://purl.org/dc/elements/1.1/>

SELECT ?x ?y

WHERE { { ?book dc10:title ?x } UNION { ?book dc11:title ?y } }

在 gStore 上进行 SPARQL 查询得到的结果:

final result is :

?x ?y

"SPARQL (updated)"

"SPARQL Protocol

Tutorial"

"SPARQL"

"SPARQL Query Language Tutorial"

联合模式结合了图模式;每一种可能性都可以包含不止一种三重模式,下面

查询仅在图书同时具有都柏林 Core 相同版本的标题谓词和创建者谓词时才匹配

该图书。

查询语句为:

PREFIX dc10: <http://purl.org/dc/elements/1.0/>

PREFIX dc11: <http://purl.org/dc/elements/1.1/>

SELECT ?title ?author

WHERE { { ?book dc10:title ?title . ?book dc10:creator ?author }

UNION

{ ?book dc11:title ?title . ?book dc11:creator ?author }

}

Page 56: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

52

在 gStore 上进行 SPARQL 查询得到的结果:

final result is :

?title ?author

"SPARQL Query Language Tutorial" "Alice"

"SPARQL Protocol Tutorial" "Bob"

8.5 逻辑否定

SPARQL 查询语言包含两种类型的否定,一种基于过滤结果(取决于图模式

在被过滤的查询结果上下文中是否匹配),主要基于参数NOT EXISTS;另一种基于

删除与另一种模式相关的结果,主要基于参数 MINUS。目前 gStore 只支持基于

删除与另一种模式相关的结果。

假设我们有一个 RDF 三元组数据如下:

@prefix : <http://example/> .

@prefix foaf: <http://xmlns.com/foaf/0.1/> .

:alice foaf:givenName "Alice" ;

foaf:familyName "Smith" .

:bob foaf:givenName "Bob" ;

foaf:familyName "Jones" .

:carol foaf:givenName "Carol" ;

foaf:familyName "Smith" .

查询语句为:

PREFIX : <http://example/>

PREFIX foaf: <http://xmlns.com/foaf/0.1/>

SELECT DISTINCT ?s

WHERE {

?s ?p ?o .

MINUS {

?s foaf:givenName "Bob" .

}

}

在 gStore 上进行 SPARQL 查询得到的结果:

final result is :

?s

Page 57: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

53

<http://example/carol>

<http://example/alice>

8.6 结果排序和修改

查询模式生成一个无序的结果集合,每个结果都是一个从变量到 RDF 术语

的部分函数。然后,这些解被视为一个序列(一个解序列),最初没有特定的顺序;

然后应用任何序列修饰符来创建另一个序列。最后,使用后一个序列生成

SPARQL 查询表单的结果之一。

8.6.1 ORDER BY

ORDER BY 子句建立了结果序列的顺序。ORDER BY 子句后面是一系列

ORDER 比较器,由一个表达式和一个可选的 ORDER 修饰符(ASC()或 DESC())

组成。每个顺序比较器要么是升序的(由 ASC()修饰符表示,要么没有修饰符),

要么是降序的(由 DESC()修饰符表示)。

假设我们有一个 RDF 三元组数据如下:

@prefix : <http://example.com/ns> .

@prefix foaf: <http://xmlns.com/foaf/0.1/> .

_:a foaf:name "Johnny Lee Outlaw" .

_:a foaf:mbox <mailto:[email protected]> .

_:b foaf:name "Peter Goodguy" .

_:b foaf:mbox <mailto:[email protected]> .

_:c foaf:mbox <mailto:[email protected]> .

_:a :employeeName "Alice" .

_:a :employeeId 12345 .

_:b :employeeName "Bob" .

_:b :employeeId 67890 .

查询语句为:

PREFIX : <http://example.com/ns>

PREFIX foaf: <http://xmlns.com/foaf/0.1/>

SELECT ?emp

WHERE { ?x :employeeId ?emp }

ORDER BY ASC(?emp)

在 gStore 上进行 SPARQL 查询得到的结果:

final result is :

Page 58: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

54

?emp

"12345"^^<http://www.w3.org/2001/XMLSchemainteger>

"67890"^^<http://www.w3.org/2001/XMLSchemainteger>

8.6.2 Projection

可以将解序列转换为只包含变量子集的解序列。对于序列中的每个结果,使

用 SELECT 查询表单指定的变量选择将形成一个新的结果。下面的示例显示了

一个查询,该查询仅提取 RDF 图中使用 FOAF 属性描述的人名。

假设我们有一个 RDF 三元组数据如下:

@prefix foaf: <http://xmlns.com/foaf/0.1/> .

_:a foaf:name "Alice" .

_:a foaf:mbox <mailto:[email protected]> .

_:b foaf:name "Bob" .

_:b foaf:mbox <mailto:[email protected]> .

查询语句为:

PREFIX foaf: <http://xmlns.com/foaf/0.1/>

SELECT ?name

WHERE

{ ?x foaf:name ?name }

在 gStore 上进行 SPARQL 查询得到的结果:

final result is :

?name

"Bob"

"Alice"

8.6.3 Duplicate Solutions

没有明显或减少查询修饰符的结果序列将保留重复的结果。

假设我们有一个 RDF 三元组数据如下:

@prefix foaf: <http://xmlns.com/foaf/0.1/> .

_:x foaf:name "Alice" .

_:x foaf:mbox <mailto:[email protected]> .

Page 59: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

55

_:y foaf:name "Alice" .

_:y foaf:mbox <mailto:[email protected]> .

_:z foaf:name "Alice" .

_:z foaf:mbox <mailto:[email protected]> .

查询语句为:

PREFIX foaf: <http://xmlns.com/foaf/0.1/>

SELECT ?name WHERE { ?x foaf:name ?name }

在 gStore 上进行 SPARQL 查询得到的结果:

final result is :

?name

"Alice"

"Alice"

"Alice"

修饰符的不同和减少会影响查询结果中是否包含重复项。

8.6.3.1 DISTINCT

DISTINCT 的结果修饰符消除了重复的结果。查询只返回一个将相同变量绑

定到相同 RDF 术语的结果。

查询语句为:

PREFIX foaf: <http://xmlns.com/foaf/0.1/>

SELECT DISTINCT ?name WHERE { ?x foaf:name ?name }

在 gStore 上进行 SPARQL 查询得到的结果:

final result is :

?name

"Alice"

8.6.3.2 REDUCED

distinct 修饰符确保从解果集中消除重复的结果,而 reduce 则允许消除重复

的结果。在简化的结果集中,任何一组变量绑定的基数至少为一个,且不超过没

有明显或简化修饰符的结果集的基数。例如,使用上面的数据查询。

查询语句为:

PREFIX foaf: <http://xmlns.com/foaf/0.1/>

SELECT REDUCED ?name WHERE { ?x foaf:name ?name }

Page 60: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

56

在 gStore 上进行 SPARQL 查询得到的结果:可能有一个,两个或三个结果(下边

显示的)

final result is :

?name

"Alice"

"Alice"

"Alice"

8.6.4 OFFSET

OFFSET 导致生成的结果在指定的结果数量之后启动。OFFSET 为零没有影

响。使用 LIMIT 和 OFFSET 选择查询结果的不同子集是没有用的,除非使用 order

by 使顺序可预测。

假设我们有一个 RDF 三元组数据如下:

@prefix foaf: <http://xmlns.com/foaf/0.1/> .

_:x foaf:name "Alice" .

_:x foaf:mbox <mailto:[email protected]> .

_:y foaf:name "Alice" .

_:y foaf:mbox <mailto:[email protected]> .

_:z foaf:name "Alice" .

_:z foaf:mbox <mailto:[email protected]> .

查询语句为:

PREFIX foaf: <http://xmlns.com/foaf/0.1/>

SELECT ?name

WHERE { ?x foaf:name ?name }

ORDER BY ?name

LIMIT 5

OFFSET 1

在 gStore 上进行 SPARQL 查询得到的结果:

final result is :

?name

"Alice"

Page 61: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

57

"Alice"

8.6.5 LIMIT

LIMIT 子句为返回的结果数量设置了上限。如果应用 OFFSET 后实际解的

个数大于极限,则最多返回极限解的个数。

假设我们有一个 RDF 三元组数据如下:

@prefix foaf: <http://xmlns.com/foaf/0.1/> .

_:x foaf:name "Alice" .

_:x foaf:mbox <mailto:[email protected]> .

_:y foaf:name "Alice" .

_:y foaf:mbox <mailto:[email protected]> .

_:z foaf:name "Alice" .

_:z foaf:mbox <mailto:[email protected]> .

查询语句为:

PREFIX foaf: <http://xmlns.com/foaf/0.1/>

SELECT ?name

WHERE { ?x foaf:name ?name }

LIMIT 1

在 gStore 上进行 SPARQL 查询得到的结果:

final result is :

?name

"Alice"

8.7 图更新

8.7.1 INSERT DATA

将一些三元组添加到图库中。

假设我们有一个 RDF 三元组数据如下:

# Default graph

@prefix dc: <http://purl.org/dc/elements/1.1/> .

@prefix ns: <http://example.org/ns#> .

<http://example/book1> ns:price 42 .

Page 62: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

58

查询语句为:

PREFIX dc: <http://purl.org/dc/elements/1.1/>

INSERT DATA

{

<http://example/book1> dc:title "A new book" ;

dc:creator "A.N.Other" .

}

插入前在 gStore 上进行 SPARQL 查询得到的结果:

final result is :

?x ?y ?z

<http://example/book1> <http://example.org/ns#price>

"42"^^<http://www.w3.org/2001/XMLSchema#integer>

插入后在 gStore 上进行 SPARQL 查询得到的结果:

final result is :

?x ?y ?z

<http://example/book1> <http://example.org/ns#price>

"42"^^<http://www.w3.org/2001/XMLSchema#integer>

<http://example/book1> dc:title "A new book"

<http://example/book1> dc:creator "A.N.Other"

下面这个更新请求添加了一个三元组来提供一本书的价格。与前面影响默认

图的示例相反,所请求的更改发生在 IRI http://example/bookStore 标识的命名图

中。

RDF 三元组数据如下:

# Graph: http://example/bookStore

@prefix dc: <http://purl.org/dc/elements/1.1/> .

<http://example/book1> dc:title "Fundamentals of Compiler Design" .

查询语句为:

PREFIX dc: <http://purl.org/dc/elements/1.1/>

PREFIX ns: <http://example.org/ns#>

INSERT DATA

{ GRAPH <http://example/bookStore> { <http://example/book1> ns:price 42 } }

插入前在 gStore 上进行 SPARQL 查询得到的结果:

Page 63: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

59

final result is :

?x ?y ?z

<http://example/book1> <http://purl.org/dc/elements/1.1/title> "Fundamentals of

Compiler Design"

插入后在 gStore 上进行 SPARQL 查询得到的结果:

final result is :

?x ?y ?z

<http://example/book1> <http://purl.org/dc/elements/1.1/title> "Fundamentals of

Compiler Design"

<http://example/book1> ns:price 42

8.7.2 DELETE DATA

从图中删除三元组。

假设我们有一个 RDF 三元组数据如下:

# Default graph

@prefix dc: <http://purl.org/dc/elements/1.1/> .

@prefix ns: <http://example.org/ns#> .

<http://example/book2> ns:price 42 .

<http://example/book2> dc:title "David Copperfield" .

<http://example/book2> dc:creator "Edmund Wells" .

查询语句为:

PREFIX dc: <http://purl.org/dc/elements/1.1/>

DELETE DATA

{

<http://example/book2> dc:title "David Copperfield" ;

dc:creator "Edmund Wells" .

}

删除前在 gStore 上进行 SPARQL 查询得到的结果:

final result is :

?x ?y ?z

<http://example/book2> <http://example.org/ns#price>

"42"^^<http://www.w3.org/2001/XMLSchema#integer>

<http://example/book2> <http://purl.org/dc/elements/1.1/title> "David Copperfield"

<http://example/book2> <http://purl.org/dc/elements/1.1/creator> "Edmund Wells"

Page 64: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

60

删除后在 gStore 上进行 SPARQL 查询得到的结果:

final result is :

?x ?y ?z

<http://example/book2> <http://example.org/ns#price>

"42"^^<http://www.w3.org/2001/XMLSchema#integer>

删除有过滤条件的三元组

RDF 三元组数据如下:

@prefix dc: <http://purl.org/dc/elements/1.1/> .

<http://example/book1> dc:title "Principles of Compiler Design" .

<http://example/book2> dc:title "David Copperfield" .

<http://example/book2> dc:creator "Edmund Wells" .

<http://example/book3> dc:title "SPARQL 1.1 Tutorial" .

查询语句为:

# Default graph

PREFIX dc: <http://purl.org/dc/elements/1.1/>

PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

DELETE

{ ?book ?p ?v }

WHERE

{ ?book dc:creator ?d .

FILTER ( ?d = "Edmund Wells" )

?book ?p ?v

}

删除前在 gStore 上进行 SPARQL 查询得到的结果:

final result is :

?x ?y ?z

<http://example/book1> <http://purl.org/dc/elements/1.1/title> "Principles of Compiler

Design"

<http://example/book2> <http://purl.org/dc/elements/1.1/title> "David Copperfield"

<http://example/book3> <http://purl.org/dc/elements/1.1/title> "SPARQL 1.1 Tutorial"

<http://example/book2> <http://purl.org/dc/elements/1.1/creator> "Edmund Wells"

删除后在 gStore 上进行 SPARQL 查询得到的结果:

final result is :

?x ?y ?z

<http://example/book1> <http://purl.org/dc/elements/1.1/title> "Principles of Compiler

Design"

Page 65: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

61

<http://example/book3> <http://purl.org/dc/elements/1.1/title> "SPARQL 1.1 Tutorial"

8.7.3 ALTER DATA

更新请求由两个操作组成,包括要删除的三元组和要添加的三元组(在这里

用于纠正书名)。与前面影响默认图的示例相反,所请求的更改发生在 IRI

http://example/bookStore 标识的命名图中。

假设我们有一个 RDF 三元组数据如下:

# Graph: http://example/bookStore

@prefix dc: <http://purl.org/dc/elements/1.1/> .

<http://example/book1> dc:title "Fundamentals of Compiler Desing" .

查询语句为:

PREFIX dc: <http://purl.org/dc/elements/1.1/>

DELETE DATA

{ GRAPH <http://example/bookStore> { <http://example/book1> dc:title

"Fundamentals of Compiler Desing" } } ;

PREFIX dc: <http://purl.org/dc/elements/1.1/>

INSERT DATA

{ GRAPH <http://example/bookStore> { <http://example/book1> dc:title

"Fundamentals of Compiler Design" } }

更新前在 gStore 上进行 SPARQL 查询得到的结果:

final result is :

?x ?y ?z

<http://example/book1> <http://purl.org/dc/elements/1.1/title> "Fundamentals of

Compiler Desing"

更新后在 gStore 上进行 SPARQL 查询得到的结果:

final result is :

?x ?y ?z

<http://example/book1> <http://purl.org/dc/elements/1.1/title> "Fundamentals of

Compiler Design"

Page 66: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

62

九、 gStore 项目框架

**待补充**

Page 67: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

63

十、 发表论文

gStore 部分重点相关学术论文如下:

1.Lei Zou, Jinghui Mo, Lei Chen, M. Tamer Özsu, Dongyan Zhao: gStore: Answering

SPARQL Queries via Subgraph Matching. PVLDB 4(8): 482-493 (2011)

2.Lei Zou, M. Tamer Özsu, Lei Chen, Xuchuan Shen, Ruizhe Huang, Dongyan Zhao:

gStore: a graph-based SPARQL query engine. VLDB Journal. 23(4): 565-590 (2014)

3.Li Zeng, Lei Zou: Redesign of the gStore system. Frontiers Comput. Sci. 12(4): 623-

641 (2018)

4.Peng Peng, Lei Zou, Runyu Guan: Accelerating Partial Evaluation in Distributed

SPARQL Query Evaluation. ICDE 2019: 112-123

5.Peng Peng, Lei Zou, M. Tamer Özsu, Lei Chen, Dongyan Zhao: Processing SPARQL

queries over distributed RDF graphs. VLDB Journal. 25(2): 243-268 (2016)

Page 68: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

64

十一、项目大事记

2011 年

gStore 第一篇相关学术论文发表

Lei Zou., et al: gStore: Answering SPARQL Queries via Subgraph Matching.

PVLDB 4(8): 482-493 (2011)

PKUMOD 研究团队获得中国自然科学基金委青年基金项目“基于图数据库理

论的海量 RDF 数据存储和查询方法研究”资助

2014 年

PKUMOD 图数据管理相关理论研究工作“海量图结构数据存储和查询优化理

论研究”,获得中国计算机学会自然科学二等奖(邹磊排名第一)

基于知识图谱的自然语言问答研究工作 gAnswer 第一篇相关学术论文发表

Lei Zou, Ruizhe Huang, Haixun Wang, Jeffery Xu Yu, Wenqiang He, Dongyan Zhao,

Natural Language Question Answering over RDF ---- A Graph Data Driven Approach,

SIGMOD 2014

PKUMOD 研究团队获得中国自然科学基金委面上项目“基于图的大规模异质

信息网络的匹配查询关键技术研究”资助

2015 年

gStore 相关代码在 Github 上正式开源,版本 0.1

2016 年

PKUMOD 研究团队获得中国科技部重点研发课题“图数据管理关键技术及系

统”资助

2017 年

PKUMOD 研究团队在 Github 上发布 gStore 里程碑版本 V0.5 版

2018 年

PKUMOD 团队发表论文 Multi-Query Optimization in Federated RDF Systems,

获得 23rd International Conferenceon Database Systems for Advanced Applications

Page 69: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

65

(DASFAA)最佳论文奖(BEST PAPER AWARD)

gStore 系统的相关理论研究工作“大规模图结构数据管理”,获得中国教育部自

然科学二等奖(邹磊排名第一)

PKUMOD 研究团队基于知识图谱的自然语言问答研究工作 gAnswer 系统在

Github 上正式开源,版本号 V0.1

gAnswer 系统参加欧盟举办的知识库自然语言问答比赛 QALD-9,斩获第一名

Page 70: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

66

十二、开源与法律条款

12.1 开源与社区

gStore 系统从 2015 年 1 月开始在 Github 上开源,遵从 BSD 3-Clause 开源协

议,开源地址是`https://github.com/pkumod/gStore` ; 我们倡导用户在尊重代码作

者的著作权前提下,自由地使用和修改 gStore,开发各种基于 gStore 的知识图谱

行业应用,推动知识图谱行业软件的健康和可持续发展。我们鼓励用户积极地使

用 gStore 系统、报告问题、提出建议,并且向 gStore 开源项目贡献代码,加入我

们,使 gStore 系统变得更好。

在使用过程中遇到任何问题,如果你愿意告诉我们你的姓名、机构、使用

gStore 目的和邮箱,通过发邮件至 [email protected],我们将及时回复您。我们

保证不会泄露您和您单位的隐私,只用于提高 gStore 系统本身。

12.2 法律条款

gStore 系统一直采用开源社区中广泛使用的 BSD 3-Clause 开源协议;根据

该协议,用户在遵从下面的条款情况下,使用者可以自由地修改和重新发布代码,

也允许使用者在 gStore 代码基础上自由地开发商业软件,以及发布和销售。具体

条款如下:

Copyright (c) 2016 gStore team All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are

permitted provided that the following conditions are met:

- Redistributions of source code must retain the above copyright notice, this list of

conditions and the following disclaimer.

- Redistributions in binary form must reproduce the above copyright notice, this list of

conditions and the following disclaimer in the documentation and/or other materials

provided with the distribution.

- Neither the name of the Peking University nor the names of its contributors may be

used to endorse or promote products derived from this software without specific prior

written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND

CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,

INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF

Page 71: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

67

MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE

DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR

CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,

SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT

NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;

LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)

HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN

CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR

OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,

EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

中文条款声明如下(具有同等法律效应):

版权所有(c) 2016 gStore 团队保留所有权利。

在遵守以下条件的前提下,可以以源代码及二进制形式再发布或使用软件,包括

进行修改或不进行修改:

- 源代码的再发布必须保持上述版权通知,本条件列表和以下声明。

- 以二进制形式再发布软件时必须在文档和/或发布提供的其他材料中复制上述

版权通知,本条件列表和以下声明。

- 未经事先书面批准的情况下,不得利用北京大学或贡献者的名字用于支持或推

广该软件的衍生产品。

本软件为版权所有人和贡献者“按现状”为根据提供,不提供任何明确或暗示的保

证,包括但不限于本软件针对特定用途的可售性及适用性的暗示保证。在任何情

况下,版权所有人或其贡献者均不对因使用本软件而以任何方式产生的任何直接、

间接、偶然、特殊、典型或因此而生的损失(包括但不限于采购替换产品或服务;

使用价值、数据或利润的损失;或业务中断)而根据任何责任理论,包括合同、

严格责任或侵权行为(包括疏忽或其他)承担任何责任,即使在已经提醒可能发

生此类损失的情况下。

我们严格要求使用者,在其所发布的基于 gStore 代码基础上开发的软件和基于

gStore 的应用软件产品上标有“powered by gStore”和 gStore 标识(标识参考第 13

章)。

Page 72: gStore 系统使用手册 · 发布和销售;但是以上的前提是必须满足第14 章“法律条款”中,根据BSD 3-Clause开源协议,我们所拟定的相关法律条款。我们严格要求使用者,在其所发

68

十三、gStore 标识

13.1 gStore 的图片标识

13.2 Powered by gStore 推荐标识