【发布时间】:2018-08-28 15:10:53
【问题描述】:
我正在尝试加快和优化此查询
select distinct ?root where {
?root a :Root ;
:hasnode* ?node ;
:hasnode* ?node2 .
?node a :Node ;
:hasAnnotation ?ann .
?ann :hasReference ?ref .
?ref a :ReferenceType1 .
?node2 a :Node ;
:hasAnnotation ?ann2 .
?ann2 :hasReference ?ref2 .
?ref2 a :ReferenceType2 .
}
基本上,我正在分析一些树,我想获取所有树(即树的根),它们至少有几个底层节点,其模式如下:
?node_x a :Node ;
:hasAnnotation ?ann_x .
?ann_x :hasReference ?ref_x .
?ref_x a :ReferenceTypex .
一个是x = 1,另一个是x = 2。
由于在我的图中,一个节点最多可能有一个:hasAnnotation 谓词,因此我不必指定这些节点必须不同。
问题
上述查询描述了我需要的内容,但性能确实很差。经过几分钟和几分钟的执行,它仍在运行。
我的(丑陋的)解决方案:把它分成两半
我注意到,如果一次查找节点模式,我会在几秒钟内得到结果(!)。
很遗憾,我目前的方法是运行以下查询类型两次:
select distinct ?root where {
?root a :Root ;
:hasnode* ?node .
?node a :Node ;
:hasAnnotation ?ann_x .
?ann_x :hasReference ?ref_x .
?ref_x a :ReferenceTypex .
}
一个是x = 1,另一个是x = 2。
将部分结果(即?roots)保存在两组中,假设R1 和R2,最后计算这些结果集之间的交集。
有没有一种方法可以通过利用 SPARQL 来加快我获得结果的初始方法?
PS:我正在使用 GraphDB。
【问题讨论】:
-
自动提示:嵌套查询可能会有所帮助
-
尝试将两个组都包含在
{}中。 PS。 FactForge 是否包含一些与您的数据相似的数据? -
关于 PS:很遗憾,没有,或者至少,我不知道有任何相似之处。
-
不管怎样,它们是一种带注释的家谱。
标签: sparql rdf semantic-web graphdb