gStore基础操作(命令行)

二. gStore基础操作(命令行)

2.1 初始化系统数据库

只要下载并编译gStore系统的代码,就会自动创建一个名为system(真实目录名称system.db)的数据库。这是管理系统统计信息的数据库,包括所有用户和所有数据库。您可以使用gquery命令查询此数据库,但禁止使用编辑器对其进行修改。system 数据库为gStore内置的系统数据库,该数据库无法删除,用于保存系统相关信息,尤其是已构建的数据库信息,如果 system 数据库损坏,可能导致 ghttp 无法启动,因此gStore提供了初始化系统数据库功能

命令行模式(ginit)

ginit用于初始化数据库

$ bin/gbuild -db dbname -f filename

命令参数:如果没有写任何的数据库名称,则重新初始化的 system 数据库中将没有其他数据库信息

示例:

$ bin/ginit -db [db_name1],[db_name2],[...] 

参数含义:

dbname:数据库名称

filename:带“.nt”或者".n3"后缀的文件所在的文件路径

2.2 创建数据库

创建数据库操作是gStore最重要的操作之一,也是用户安装gStore后需要做的第一个操作,gStore提供

多种方式进行数据库创建操作。

命名行模式(gbuild)

gbuild命令用于从RDF格式文件创建新的数据库,使用方式:

$ bin/gbuild -db dbname -f filename

参数含义:

例如,我们从lubm.nt构建一个名为“lubm2.db”的数据库,可以在数据文件夹中找到。

$ bin/gbuild -db lubm2 -f ./data/lubm/lubm.nt
image-20220713131239266

此时说明数据库已经构建完成!

注意: 不能以空的RDF数据集来创建数据库

不能直接 cd 到 bin 目录下,而要在gStore安装根目录执行gbuild操作

使用本地数据创建数据库:

  • 首先将数据以RDF的格式写入到以.nt结尾的文件中,如下所示

    image-20220713131753761
  • 采用gbuild命令创建数据库

    $ bin/gbuild -db test  -f ./data/test/test.nt
    

2.3 数据库列表

gshow用于获取所有可用数据库列表信息。

$ bin/gshow
image-20220713132317309

2.4 数据库状态查询

gmonitor用于获取指定数据库的统计信息。

$ bin/gmonitor -db db_name
image-20220713132520879

2.5 数据库查询

数据库查询是gStore最重要的功能之一,gStore支持W3C定义的SPARQL 1.1查询语言,用户可以通

过如下几种方式使用gStore数据库查询功能。

命令行模式(gquery)

gquery用于使用包含SPARQL查询的文件查询现有数据库。(每个文件包含一个精确的SPARQL语句,

SPARQL语句不仅可以进行查询操作,还可以进行增加和删除操作)

  • 查询名为db_name的数据库,输入以下命令:

    bin/gquery -db db_name -q query_file
    

参数含义:

db_name: 数据库名称

query_file:以“.sql”结尾的SPARQL语句存放的文件路径(其他后缀名也可以)

例如执行:

bin/gquery -db test -q ./data/test/test_q2.sql

得到结果:

image-20220713132933012
  • 了解gquery的详细使用,可以输入以下命令进行查看:

    bin/gquery --help
    
  • 进入gquery控制台命令:

    bin/gquery -db dbname
    
    • 使用 help 看到所有命令的基本信息

    • 输入 quit 以退出gquery控制台。

    • 对于 sparql 命令, 使用 sparql query_file 执行SPARQL查询语句,query_file为存放SPARQL语句的文件路径。当程序完成回答查询时,它会再次显示命令提示符。

    • 程序显示命令提示符(“gsql>”),也可以在此处输入命令:

bin/gquery -db db_name -q query_file 

db_name: 数据库名称
query_file:以“.sql”结尾的SPARQL语句存放的文件路径(其他后缀名也可以)

2.6 数据库导出

gexport用于导出某个数据库。

用法:

bin/gexport -db db_name -f path

命令参数:

db_name:数据库名称

path:导出到指定文件夹下(如果为空,则默认导出到gStore根目录下)

删除数据库功能可以删除指定数据库,有如下三种形式

2.6 删除数据库(gdrop)

gdrop用于删除某个数据库。

用法:

$ bin/gdrop -db db_name

命令参数:

db_name:数据库名称

删除数据库,不应该只是输入 rm -r db_name.db 因为这不会更新名为的内置数据库 system 。相

反,你应该输入 bin/gdrop -db db_name 。

插入RDF数据是gStore常规操作,用户可以通过如下几种方式来执行数据插入操作。

2.7 新增数据

命令行模式(gadd)–文件

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

用法:

$ bin/gadd -db db_name -f rdf_triple_file_path

参数含义:

db_name:数据库名称

rdf_triple_file_path:带".nt"或者".n3"后缀的文件路径

注意:

gadd主要用于RDF文件数据插入

不能直接 cd 到 bin 目录下,而要在gStore安装根目录执行 gadd 操作

命令行模式(gquery)—SPARQL语句

SPARQL定义中可以通过 insert data 指令来实现数据插入,基于此原理,用户也可以通过编写

SPARQL插入语句,然后使用gStore的 gquery 工具来实现数据插入,其中SPARQL插入语句示例如下:

insert data { 
<张三> <性别> "男"^^<http://www.w3.org/2001/XMLSchema#String>.
<张三> <年龄> "28"^^<http://www.w3.org/2001/XMLSchema#Int>.
<张三> <好友> <李四>.
}

通过 {} 可以包含多条RDF数据,注意每条RDF数据都要以 . 结尾

由于可以使用数据库查询功能实现数据插入,因此也同样可以使用如下功能来进行数据插入。

2.8 删除数据

命令行模式(gsub)–文件删除

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

用法:

bin/gsub db_name rdf_triple_file_path

参数含义:

rdf_triple_file_path:带".nt"或者以“.n3"后缀的所要删除的数据文件路径

命令行模式(gquery)—SPARQL语句

SPARQL定义中可以通过 delete data 指令来实现数据插入,基于此原理,用户也可以通过编写

SPARQL插入语句,然后使用gStore的 gquery 工具来实现数据插入,其中SPARQL插入语句示例如下:

delete data { 
<张三> <性别> "男"^^<http://www.w3.org/2001/XMLSchema#String>. 
<张三> <年龄> "28"^^<http://www.w3.org/2001/XMLSchema#Int>. 
<张三> <好友> <李四>.
}

通过 {} 可以包含多条RDF数据,注意每条RDF数据都要以 . 结尾

另外SPARQL中还可以通过 delete where 语句来实现根据子查询结构删除数据,如下所示。

delete where 
{ 
<张三> ?x ?y. 
}

该语句表示删除 张三 实体的所有信息(包括属性和关系)

由于可以使用数据库查询功能实现数据插入,因此也同样可以使用如下功能来进行数据插入。

2.9 高级环路查询

查询是否存在包含结点 u 和 v 的一个环。

cyclePath(u, v, directed, pred_set) 
cycleBoolean(u, v, directed, pred_set)

用于 SELECT 语句中,与聚合函数使用语法相同。

参数:

u , v :变量或结点 IRI

directed :布尔值,为真表示有向,为假表示无向(图中所有边视为双向)

pred_set :构成环的边上允许出现的谓词集合。若设置为空 {} ,则表示允许出现数据中的所有谓词

返回值

cyclePath :以 JSON 形式返回包含结点 u 和 v 的一个环(若存在)。若 u 或 v 为变量,对

变量的每组有效值返回一个环。

cycleBoolean :若存在包含结点 u 和 v 的一个环,返回真;否则,返回假。

下面的查询询问是否存在包含 Carol 、一个 Francis 不喜欢的人(示例数据中即为 Dave 或 Eve ),且

构成它的边只能由“喜欢”关系标记的有向环:

结果如下:
image-20220713142709854

如果希望输出一个满足以上条件的环,则使用下面的查询:

SELECT (cyclePath(?x, <Carol>, true, {<喜欢>}) as ?y) 
WHERE 
{ 
<Francis> <不喜欢> ?x . 
}

结果如下,可见其中一个满足条件的环由 Eve 喜欢 Carol - Carol 喜欢 Bob - Bob 喜欢 Eve 顺次构成:

(为方便阅读,省略了字符串最外层的双引号和内部双引号的转义)

{ "paths":
[
{ "src":"<Eve>", "dst":"<Carol>", "edges": 
[{"fromNode":2,"toNode":3,"predIRI":"<喜欢>"}, {"fromNode":3,"toNode":1,"predIRI":"<喜欢>"},{"fromNode":1,"toNode":2,"predIRI":" <喜欢>"}], "nodes": [{"nodeIndex":1,"nodeIRI":"<Bob>"},{"nodeIndex":3,"nodeIRI":"<Carol>"}, {"nodeIndex":2,"nodeIRI":"<Eve>"}]
}
]
}

若使用命令行测试上述sparql语句,得不到json答案,因此开启ghttp服务,使用接口测试工具测试环路查询结果。

  • cyclePath查询结果

    image-20220713143811941
  • cycleBoolean查询结果

image-20220713143704281

最短路径查询

查询从结点 u 到结点 v 的最短路径。

shortestPath(u, v, directed, pred_set) 
shortestPathLen(u, v, directed, pred_set)

用于 SELECT 语句中,与聚合函数使用语法相同。

参数

u , v :变量或结点 IRI

directed :布尔值,为真表示有向,为假表示无向(图中所有边视为双向)

pred_set :构成最短路径的边上允许出现的谓词集合。若设置为空 {} ,则表示允许出现数据中的所

有谓词

返回值

shortestPath :以 JSON 形式返回从结点 u 到 v 的一条最短路径(若可达)。若 u 或 v 为

变量,对变量的每组有效值返回一条最短路径。

shortestPathLen :返回从结点 u 到 v 的最短路径长度(若可达)。若 u 或 v 为变量,对变

量的每组有效值返回一个最短路径长度数值。

下面的查询返回从 Francis 到一个 Bob 喜欢、关注或不喜欢,且没有被 Francis 不喜欢的人(示例数据

中即为 Alice)的最短路径,边上的关系可以是喜欢或关注

SELECT (shortestPath(<Francis>, ?x, true, {<喜欢>, <关注>}) AS ?y)WHERE{ <Bob> ?pred ?x . MINUS { <Francis> <不喜欢> ?x . }}

结果如下:(为方便阅读,省略了字符串最外层的双引号和内部双引号的转义)

{ "paths":[{ "src":"<Francis>", "dst":"<Alice>", "edges": [{"fromNode":4,"toNode":3,"predIRI":"<喜欢>"}, {"fromNode":3,"toNode":1,"predIRI":"<喜欢>"},{"fromNode":1,"toNode":0,"predIRI":" <关注>"}], "nodes": [{"nodeIndex":0,"nodeIRI":"<Alice>"}, {"nodeIndex":1,"nodeIRI":"<Bob>"},{"nodeIndex":3,"nodeIRI":"<Carol>"}, {"nodeIndex":4,"nodeIRI":"<Francis>"}] }]}

如果希望只输出最短路径长度,则使用下面的查询:

SELECT (shortestPathLen(<Francis>, ?x, true, {<喜欢>, <关注>}) AS ?y)WHERE{ <Bob> ?pred ?x . MINUS { <Francis> <不喜欢> ?x . }}

结果如下:(为方便阅读,省略了字符串最外层的双引号和内部双引号的转义)

{"paths":[{"src":"<Francis>","dst":"<Alice>","length":3}]}

若使用命令行测试上述sparql语句,得不到json答案,因此开启ghttp服务,使用接口测试工具测试环路查询结果。

  • shortestPath查询结果

    image-20220713144016538
  • shortestPathLen查询结果

image-20220713144424516

2.10 可达性 / K 跳可达性查询

查询从结点 u 到结点 v 是否可达 / 是否 K 跳可达(即存在以 u 为起点、以 v 为终点,长度小于或等

于 K 的路径)。

kHopReachable(u, v, directed, k, pred_set)kHopReachablePath(u, v, directed, k, pred_set)

参数

u , v :变量或结点 IRI

k :若置为非负整数,则为路径长度上限(查询 K 跳可达性);若置为负数,则查询可达性

directed :布尔值,为真表示有向,为假表示无向(图中所有边视为双向)

pred_set :构成路径的边上允许出现的谓词集合。若设置为空 {} ,则表示允许出现数据中的所有谓

返回值

kHopReachable :若从结点 u 到结点 v 可达(或 K 跳可达,取决于参数 k 的取值),返回真;

否则,返回假。若 u 或 v 为变量,对变量的每组有效值返回一个真/假值。

kHopReachablePath :返回任意一条从结点 u 到结点 v 的路径(若可达)或K跳路径,即长度

小于或等于 k 的路径(若K跳可达,取决于参数 k 的取值)。若 u 或 v 为变量,对变量的每组有

效值返回一条路径(若可达)或K跳路径(若K跳可达)。

示例查询:起点为 Francis ,终点为一个 Bob 喜欢、关注或不喜欢,且没有被 Francis 不喜欢的人(示例数据中即为 Alice)。询问这两人之间是否通过喜欢或关注关系 2 跳或以内可达。

SELECT(kHopReachable(<Francis>,?x,true,2,{<喜欢>,<关注>}) as ?y)
where
{
<Bob> ?pred ?x .
minus {<Francis> <不喜欢> ?x .}
}

满足已知条件的最短路径为3:结果为false

image-20220713145349092

接口返回结果如下:

image-20220713145438585

另一方面,Francis 和 Alice 之间是可达的,只是最短路径长度超出了上述限制。因此若查询可达性(将

k 设置为负数),则会返回真:

SELECT(kHopReachable(<Francis>,?x,true,-1,{<喜欢>,<关注>}) as ?y)
where
{
<Bob> ?pred ?x .
minus {<Francis> <不喜欢> ?x .}
}
image-20220713145539373

若希望返回一条两人之间满足条件的路径,则可以调用 kHopReachablePath 函数:

SELECT(kHopReachablePath(<Francis>,?x,true,-1,{<喜欢>,<关注>}) as ?y)
where
{
<Bob> ?pred ?x .
minus {<Francis> <不喜欢> ?x .}
}

此时结果可能为上述最短路径:

image-20220713145756051
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值