sparql将不存在的属性计数为零

sparql将不存在的属性计数为零,sparql,rdf,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

我的问题是:

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
此标记被指定给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 }
    }
  }
}
我如何在这里使用绑定?它会提高性能吗? 谢谢

为什么不使用UNION

除此之外,您的查询集中于?t标记及其?id和?name-因此,结果不包括缺少?t的?s对象(因此缺少任何?id和?name)也就不足为奇了

我想这可能会让你走上正确的方向-

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 
  {            ?s    rdf:type    ?type  
               FILTER ( ?type IN ( :Client, :Project, :Staff ) ) .
    OPTIONAL { ?s  :hasTag   ?t    .
               ?t  rdf:type  :Tag  ;
                   :hasId    ?id   ;
                   :hasName  ?name }
  } 
GROUP BY ?id ?name

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

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

但是,我不知道这是否比一个联合或一组联合快。

如果您提供更多信息,包括查询目标、样本数据等,并且希望有没有标记的对象的数量,那就好了?您知道如何获得没有标签的标签的数量吗?在您的查询中,我看不到避免联合或子选择的方法,因为您是按标记Id和标记名称分组的,所以Id应该是什么。表示未标记对象的名称?BIND+IF-ELSE可以将未标记的标记绑定到那些没有标记的对象上。谢谢你的回答,我为这个问题添加了更多细节。在这里如何使用BIND+IF-ELSE?因为我想它一定比你快,谢谢你的回答。但这对我也不起作用。我想实际上这是我在问题开始时提出的同一个问题。我的问题与你最初提出的不同。但是你的问题的更新改变了你的目标,从有多少对象没有标签?每个标记应用于多少个对象?并使我修改的查询不相关。我没有那么多数据,但对于1000个标记和20000个对象,我为您的查询获得289毫秒
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