#gStore-weekly | gStore功能之环路查询

2022-04-20 00:00:00 查询 数据 结点 不喜欢 喜欢
我们知道在金融领域交叉持股会带来虚增资本的弊处,那如何对交叉持股进行快速识别呢?我们可以将企业之间股权关系抽取形成股权金融知识图谱,然后在该图谱上进行关联分析,实际上寻找交叉持股关系就是在图上找一个环。如果在图上存在一个环就说明存在交叉持股的可能性。那么就需要存储数据的图数据库支持环路查询。
gStore从内核版本 v0.9 开始,gStore 就加入了与数据图中结点间的路径相关的一系列查询的功能(仅企业版支持),目前包括环路查询和短路径查询。为了更好地演示环路查询的功能,使用以下的社交关系数据作为示例数据:
<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> .
上述的数据的图示如下所示:

如无特殊说明,返回路径的函数均以如下 JSON 格式字符串表示一条路径/一个环/一个子图:
{
    "src":"<src_IRI>", "dst": "<dst_IRI>",
       "edges":[
    {"fromNode": 0, "toNode": 1, "predIRI":"<pred>" }
    ],
       "nodes":[
        { "nodeIndex": 0,"nodeIRI": "<src_IRI>" },
        { "nodeIndex": 1,"nodeIRI": "<dst_IRI>" }
    ]
}
终返回值以如下形式表示一组路径/一组环/一组子图:(其中 paths 的元素为上述格式)
{ "paths":[{...}, {...}, ...] }
查询是否存在包含结点u
v
的一个环。
1.1 查询语法

我们可采用如下语法进行查询

cyclePath(u, v,directed, pred_set)
cycleBoolean(u, v,directed, pred_set)
用于 SELECT 语句中,与聚合函数使用语法相同。
1.2 参数说明


u,v

变量或结点 IRI

directed

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

pred_set

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

返回值:

cyclePath

 JSON 形式返回包含结点 u  v 的一个环(若存在)。若 u  v 为变量,对变量的每组有效值返回一个环。

cycleBoolean

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

1.3 查询示例

下面的查询询问是否存在包含 Carol 、一个 Francis 不喜欢的人(示例数据中即为 Dave  Eve ),且构成它的边只能由喜欢关系标记的有向环:

select(cycleBoolean(?x, <Carol>, true, {<喜欢>}) as ?y)

where

{

        <Francis> <不喜欢> ?x .

}

结果如下:
?y
“true”^^<http://www.w3.org/2001/XMLSchema#>
如果希望输出一个满足以上条件的环,则使用下面的查询:
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>"}]
        }]
}
下图标红的部分即为这个环:

相关文章