我们知道在金融领域交叉持股会带来虚增资本的弊处,那如何对交叉持股进行快速识别呢?我们可以将企业之间股权关系抽取形成股权金融知识图谱,然后在该图谱上进行关联分析,实际上寻找交叉持股关系就是在图上找一个环。如果在图上存在一个环就说明存在交叉持股的可能性。那么就需要存储数据的图数据库支持环路查询。gStore从内核版本 v0.9 开始,gStore 就加入了与数据图中结点间的路径相关的一系列查询的功能(仅企业版支持),目前包括环路查询和短路径查询。为了更好地演示环路查询的功能,使用以下的社交关系数据作为示例数据:<Carol> <不喜欢> <Francis> .如无特殊说明,返回路径的函数均以如下 JSON 格式字符串表示一条路径/一个环/一个子图: "src":"<src_IRI>", "dst": "<dst_IRI>", {"fromNode": 0, "toNode": 1, "predIRI":"<pred>" } { "nodeIndex": 0,"nodeIRI": "<src_IRI>" }, { "nodeIndex": 1,"nodeIRI": "<dst_IRI>" }终返回值以如下形式表示一组路径/一组环/一组子图:(其中 paths 的元素为上述格式){ "paths":[{...}, {...}, ...] }我们可采用如下语法进行查询
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 的一个环,返回真;否则,返回假。
1.3 查询示例
下面的查询询问是否存在包含 Carol 、一个 Francis 不喜欢的人(示例数据中即为 Dave 或 Eve ),且构成它的边只能由“喜欢”关系标记的有向环:select(cycleBoolean(?x, <Carol>, true, {<喜欢>}) as ?y)
where
{
<Francis> <不喜欢> ?x .
}
|
“true”^^<http://www.w3.org/2001/XMLSchema#> |
如果希望输出一个满足以上条件的环,则使用下面的查询:SELECT (cyclePath(?x,<Carol>, true, {<喜欢>}) as ?y)结果如下,可见其中一个满足条件的环由 Eve 喜欢 Carol - Carol 喜欢 Bob - Bob 喜欢 Eve 顺次构成:(为方便阅读,省略了字符串外层的双引号和内部双引号的转义)
[{"fromNode":2,"toNode":3,"predIRI":"<喜欢>"},{"fromNode":3,"toNode":1,"predIRI":"<喜欢>"},{"fromNode":1,"toNode":2,"predIRI":"<喜欢>"}], [{"nodeIndex":1,"nodeIRI":"<Bob>"},{"nodeIndex":3,"nodeIRI":"<Carol>"},{"nodeIndex":2,"nodeIRI":"<Eve>"}]