具有大量UNION的SPARQL查询的替代方案



我在Virtuoso中存储了一些命名图,我想从提供的列表中找到与最多项匹配的图。

我的查询是用程序构建的,看起来像这样:

SELECT DISTINCT ?graph (count(DISTINCT ?match) as ?matches)
WHERE {
  GRAPH ?graph {
    {?match rdf:label "term 1"} 
     UNION {?match rdf:label "term 2"} 
     UNION {?match rdf:label "term 3"}
     ...
  }
}
ORDER BY DESC(?matches)

每个术语都成为另一个UNION子句。

有更好的方法吗?查询变得又长又难看,当术语太多时,Virtuoso会抱怨。

在SPARQL 1.1中,有一个values子句可以帮助实现这一点。它可以让你写:

select ?match where {
  values ?label { "term 1" "term 2" "term 3" }
  ?match rdfs:label ?label
}

(它是rdfs:label)

另一种编写方式是:

{ ?match rdfs:label ?X . FILTER (?x in ("term 1", "term 2", "term 3")) }

或(SPARQL 1.0)

{ ?match rdfs:label ?X . FILTER ( ?x = "term 1" || ?x = "term 2" || ?x = "term 3" )  }

价值观解决方案更强大,因为它允许使用以下UNDEF(例如):

VALUES (?s ?p ?o) { (<http://abc#X> <http://abc#P1> UNDEF)
                    (UNDEF <http://abc#P2> <http://abc#Y>) }

UNDEF有一个通配符函数,返回的三元组集是单独匹配每个值三元组的并集。当然,对于大型数据集,从性能的角度来看,可能会变慢

相关内容

  • 没有找到相关文章

最新更新