我在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有一个通配符函数,返回的三元组集是单独匹配每个值三元组的并集。当然,对于大型数据集,从性能的角度来看,可能会变慢