这是我的问题:
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 }
}
}
}
我如何在这里使用绑定?它会提高性能吗? 谢谢
答案 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
然而,我不知道这是否比工会(或一堆工会)更快。