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