【问题标题】:Alternatives to SPARQL query with lots of UNIONs具有大量 UNION 的 SPARQL 查询的替代方案
【发布时间】:2013-02-08 17:30:27
【问题描述】:

我有一些命名图存储在 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 rdf semantic-web virtuoso named-graphs


    【解决方案1】:

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

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

    【讨论】:

    • 这个方案也比FILTER快。以 Wikidata 上的一个示例为例,VALUES 的速度提高了 15 倍。尽管返回的行数相差几个百分点。
    【解决方案2】:

    (它是 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" )  }
    

    【讨论】:

    • 另一种方法是使用 SPARQL 1.1 的更新值。不确定这在回答时是否可用,但值得更新答案。
    【解决方案3】:

    values 解决方案更加强大,因为它允许按如下方式使用 UNDEF(例如):

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

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

    【讨论】:

      猜你喜欢
      • 2014-10-25
      • 1970-01-01
      • 2010-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-15
      • 2011-08-01
      相关资源
      最近更新 更多