4

我有一些命名图存储在 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 会抱怨。

4

3 回答 3

4

在 SPARQL 1.1 中,有一个values子句可以帮助解决这个问题。它可以让你写:

select ?match where {
  values ?label { "term 1" "term 2" "term 3" }
  ?match rdfs:label ?label
}
于 2015-02-20T19:23:04.070 回答
3

(这是 rdfs:标签)

另一种写法是:

{ ?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" )  }
于 2013-02-23T11:52:43.900 回答
1

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

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

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

于 2016-11-20T07:24:27.017 回答