sparql将现有属性计为零

时间:2016-10-13 14:46:38

标签: sparql rdf

这是我的问题:

PREFIX     :  <http://example.org/ns#>
PREFIX  rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
SELECT  ?id ?name (count(?s) as ?count)
WHERE {
   ?t  a        :Tag ;
       :hasId   ?id ;
       :hasName ?name 
  OPTIONAL { ?s    :hasTag  ?t ;
                rdf:type    ?type  }
  FILTER (?type in (:Client, :Project, :Staff))
} GROUP BY ?id ?name

结果中不包含没有对象的标签。如何在不使用联合的情况下获得它们? 表现也很重要

目标是收集有关标签(id,名称)和分配给它们的对象数量的信息(如果没有这样的对象计数必须为0)。标记数据样本:

:tag912 :hasId        "912"^^xsd:integer
:tag912 :hasName      "Phones"

此标记分配给6个对象。

此查询适用于我:

PREFIX  :     <http://example.org/ns#>
PREFIX  rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
SELECT  ?id ?name ?count
WHERE {
  {
    SELECT ?id ?name (count(?s) as ?count)
    WHERE {
       ?t    a       :Tag ;
             :hasId   ?id ;
             :hasName ?name .
       ?s    :hasTag  ?t ;
          rdf:type    ?type 
      FILTER (?type in (:Client, :Project, :Staff))
    } GROUP BY ?id ?name
  } UNION {
    SELECT ?id ?name (0 as ?count)
    WHERE {
      ?t a        :Tag ;
         :hasId   ?id ;
         :hasName ?name
      FILTER not exists { ?s :hasTag ?t }
    }
  }
}

我如何在这里使用绑定?它会提高性能吗? 谢谢

2 个答案:

答案 0 :(得分:1)

为什么使用UNION

除此之外,您的查询主要关注?t代码及其?id?name - 因此,结果不包括{{{{{{{ 1}}缺少?s且因此缺少任何?t?id的对象...

我认为这可能会让你朝着正确的方向前进 -

?name

答案 1 :(得分:0)

您可以检查过滤器中是否绑定了?

PREFIX     :  <http://example.org/ns#>
PREFIX  rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
SELECT  ?id ?name (COUNT(?s) as ?count)
WHERE {
  ?t   a        :Tag ;
       :hasId   ?id ;
       :hasName ?name .
  OPTIONAL {
    ?s    :hasTag  ?t ;
          rdf:type    ?type .
  }
  FILTER (!BOUND(?s) || ?type in (:Client, :Project, :Staff))
} GROUP BY ?id ?name

然而,我不知道这是否比工会(或一堆工会)更快。