gStore1.2版本新增了七个高级函数,我们分成2期来对每一个函数的使用进行详细介绍,本期介绍的高级函数为单源最短路径(包括SSSP和SSSPLen)、标签传播(labelProp)、弱连通分量(WCC)三个高级函数。
1 单源最短路径
查询以结点 u 为源结点到其余结点的最短路径。提供了两种查询方式:SSSP和SSSPLen;SSSP返回最短路径,SSSPLen返回最短路径长度。
SSSP(u, directed, pred_set)
SSSPLen(u, directed, pred_set)
-
参数
u
: 变量或结点 IRI,表示源结点directed
: 布尔值,为真表示有向,为假表示无向(图中所有边视为双向)pred_set
:考虑的谓词集合(若设置为空{}
,则表示允许出现数据中的所有谓词) -
返回值
SSSP
返回最短路径,返回值为以下形式,其中 src 为 u 对应的 IRI;dst 为某可达结点对应的 IRI ;nodes 包含路径中涉及结点的下标和IRI;edges 包含路径中涉及边的首尾节点下标和谓词 IRI 。{ "paths": [ { "src": "<src_IRI>", "dst": "<dst_IRI>", "edges": [ { "fromNode": 0, "toNode": 1, "predIRI": "<pred>" } ], "nodes": [ { "nodeIndex": 0, "nodeIRI": "<src_IRI>" }, { "nodeIndex": 1, "nodeIRI": "<dst_IRI>" } ] }, ... ] }
SSSPLen
返回最短路径长度,返回值为以下形式,其中 src 为 u 对应的 IRI;dst为某可达结点对应的IRI ;length为src到dst的最短路长度。{ "paths": [ { "src": "<src_IRI>", "dst": "<dst_IRI>", "length": <src_dst_length> }, ... ] }
-
示例(数据集详见【4 示例数据集】)
下面的查询返回以Alice在无向图(图中所有边视为双向)中的单源最短路径,边上的关系可以是喜欢或关注,查询语句为:
SELECT (SSSP(<Alice>, false, {<喜欢>, <关注>}) AS ?x) WHERE{}
结果如下:
{ "paths": [ { "src": "<Alice>", "dst": "<Francis>", "edges": [ {"fromNode": 0,"toNode": 1,"predIRI": "<喜欢>"}, {"fromNode": 1,"toNode": 3,"predIRI": "<喜欢>"}, {"fromNode": 3,"toNode": 4,"predIRI": "<喜欢>"} ], "nodes": [ {"nodeIndex": 4,"nodeIRI": "<Francis>"}, {"nodeIndex": 3,"nodeIRI": "<Carol>"}, {"nodeIndex": 1,"nodeIRI": "<Bob>"}, {"nodeIndex": 0,"nodeIRI": "<Alice>"} ] }, { "src": "<Alice>", "dst": "<Carol>", "edges": [ {"fromNode": 0,"toNode": 1,"predIRI": "<喜欢>"}, {"fromNode": 1,"toNode": 3,"predIRI": "<喜欢>"} ], "nodes": [ {"nodeIndex": 3,"nodeIRI": "<Carol>"}, {"nodeIndex": 1,"nodeIRI": "<Bob>"}, {"nodeIndex": 0,"nodeIRI": "<Alice>"} ] }, { "src": "<Alice>", "dst": "<Alice>", "edges": [], "nodes": [ {"nodeIndex": 0,"nodeIRI": "<Alice>"} ] }, { "src": "<Alice>", "dst": "<Dave>", "edges": [ {"fromNode": 0,"toNode": 5,"predIRI": "<关注>"} ], "nodes": [ {"nodeIndex": 5,"nodeIRI": "<Dave>"}, {"nodeIndex": 0,"nodeIRI": "<Alice>"} ] }, { "src": "<Alice>", "dst": "<Bob>", "edges": [ {"fromNode": 0,"toNode": 1,"predIRI": "<喜欢>"} ], "nodes": [ {"nodeIndex": 1,"nodeIRI": "<Bob>"}, {"nodeIndex": 0,"nodeIRI": "<Alice>"} ] }, { "src": "<Alice>", "dst": "<Eve>", "edges": [ {"fromNode": 0,"toNode": 1,"predIRI": "<喜欢>"}, {"fromNode": 1,"toNode": 2,"predIRI": "<喜欢>"} ], "nodes": [ {"nodeIndex": 2,"nodeIRI": "<Eve>"}, {"nodeIndex": 1,"nodeIRI": "<Bob>"}, {"nodeIndex": 0,"nodeIRI": "<Alice>"} ] } ] }
若要返回所有单源最短路径的长度,则使用以下查询:
SELECT (SSSPLen(<Alice>, false, {<喜欢>, <关注>}) AS ?x) WHERE{}
结果如下:
{ "paths": [ {"src": "<Alice>","dst": "<Francis>","length": 3}, {"src": "<Alice>","dst": "<Carol>","length": 2}, {"src": "<Alice>","dst": "<Alice>","length": 0}, {"src": "<Alice>","dst": "<Dave>","length": 1}, {"src": "<Alice>","dst": "<Bob>","length": 1}, {"src": "<Alice>","dst": "<Eve>","length": 2} ] }
2 标签传播 labelProp
基于标签传播查询图中各结点的聚类情况,可用于社区发现等多种应用。
labelProp(directed, pred_set, MaxIter=maxIter)
-
参数
directed
: 布尔值,为真表示有向,为假表示无向(图中所有边视为双向)pred_set
:考虑的谓词集合(若设置为空{}
,则表示允许出现数据中的所有谓词)maxIter
: 最大迭代次数,大于等于1的整数 -
返回值
返回分类数组,其中元素为结点 IRI ,对应图中结点的一个划分。
{ "paths": [ ["<IRI_1>", "<IRI_2>"], ["<IRI_N>"], ... ] }
-
示例(数据集详见【4 示例数据集】)
下面的查询返回有向图中基于标签传播算法的聚类划分,边上的关系只能是不喜欢,查询语句为:
SELECT (labelProp(true,{<不喜欢>},MaxIter=10) AS ?x) WHERE {}
结果如下:
{ "paths": [ ["<Alice>"], ["<Bob>"], ["<Eve>","<Carol>","<Francis>","<Dave>"] ] }
函数执行过程推演:
(1)首先将图中各个节点如下赋予标签
<Alice> <Bob> <Eve> <Carol> <Francis> <Dave> 0 1 2 3 4 5 (2)标签传播过程如下表所示
<Alice> <Bob> <Eve> <Carol> <Francis> <Dave> 0 1 2 3 4 5 0 1 4 3 5 5 0 1 0 3 5 5 0 1 5 3 3 3 0 1 0 3 3 3 0 1 0 3 3 3 0 1 3 3 3 3 0 1 0 3 3 3 0 1 3 3 3 3
3 弱连通分量 WCC
返回图的所有弱连通分量。
WCC(pred_set)
-
参数
pred_set
:构成弱连通分量的边上允许出现的谓词集合。若设置为空{}
,则表示允许出现数据中的所有谓 -
返回值
返回分类数组,形式与标签传播的返回值相同。
{ "paths": [ ["<IRI_1>", "<IRI_2>"], ["<IRI_N>"], ... ] }
-
示例(数据集详见【4 示例数据集】)
下面的查询返回图中的所有弱连通分量,且构成它的边只能由喜欢关系标记:
select (WCC({<喜欢>}) as ?y) where{}
结果如下,即 Francis、Alice、Bob、Carol、Eve 在一个弱连通分量中,Dave 在另一个弱连通分量中:
{ "paths":[ ["<Francis>","<Alice>","<Bob>","<Carol>","<Eve>"], ["<Dave>"] ] }
4 示例数据集
<Alice> <关注> <Bob> .
<Alice> <喜欢> <Bob> .
<Alice> <不喜欢> <Eve> .
<Bob> <关注> <Alice> .
<Bob> <喜欢> <Eve> .
<Carol> <关注> <Bob> .
<Carol> <喜欢> <Bob> .
<Carol> <不喜欢> <Francis> .
<Dave> <关注> <Alice> .
<Dave> <关注> <Eve> .
<Dave> <不喜欢> <Francis> .
<Eve> <喜欢> <Carol> .
<Francis> <喜欢> <Carol> .
<Francis> <不喜欢> <Dave> .
<Francis> <不喜欢> <Eve> .
虚拟网络社交图
以上为gStore1.2中新增的三个高级函数的使用详解,下一篇我们将继续介绍新增的另外四个高级函数的使用详解。