当聚合结果为零时,我对SPARQL聚合的行为感到惊讶。
当有1+个结果(在聚合之前)之后,一切都按照我的预期运行,并且与我在SQL中得到的结果相同。如果有0个结果,我会得到一个包含单个空绑定[{}]
的响应,而我所期望的结果是[]
没有结果。这在SQL中引起了我的注意,这将导致零行。
HAVING
字段中添加至少需要一个结果的group by
条款是最佳解决方案吗?一个例子:
数据:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX : <http://schema#>
PREFIX d: <http://data#>
INSERT DATA {
d:a rdf:type :User ;
:name "bob" ;
:val 1 .
d:b rdf:type :User ;
:name "bill" ;
:val 1 .
d:d rdf:type :User ;
:name "ben" ;
:val 2 .
}
如果我执行此查询,我会得到预期的结果,因为有结果,预聚合:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX : <http://schema#>
PREFIX d: <http://data#>
SELECT ?val (GROUP_CONCAT(DISTINCT ?name) AS ?names)
WHERE {
?user rdf:type :User ;
:name ?name ;
:val ?val .
}
GROUP BY ?val
结果:
{
'head': {
'vars': ['val', 'names']
},
'results': {
'bindings': [
{
'val': {
'datatype': 'http://www.w3.org/2001/XMLSchema#integer',
'type': 'literal',
'value': '1'
},
'names': {
'type': 'literal',
'value':
'bob bill'
}
},
{
'val': {
'datatype': 'http://www.w3.org/2001/XMLSchema#integer',
'type': 'literal',
'value': '2'
},
'names': {
'type': 'literal',
'value': 'ben'
}
}
]
}
}
但是,如果我要添加一个寻找val
为3的子句,则预聚合的结果为零。
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX : <http://schema#>
PREFIX d: <http://data#>
SELECT ?val (GROUP_CONCAT(DISTINCT ?name) AS ?names)
WHERE {
BIND (3 AS ?val)
?user rdf:type :User ;
:name ?name ;
:val ?val .
}
GROUP BY ?val
结果:
{
'head': {
'vars': ['val', 'names']
},
'results': {
'bindings': [
{
'names': {
'type': 'literal',
'value': ''
}
}
]
}
}
这不是我所期待的。
我可以使用HAVING
解决此问题,但我想知道为什么这是必要的?
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX : <http://schema#>
PREFIX d: <http://data#>
SELECT ?val (GROUP_CONCAT(DISTINCT ?name) AS ?names)
WHERE {
BIND (3 AS ?val)
?user rdf:type :User ;
:name ?name ;
:val ?val .
}
GROUP BY ?val
HAVING(COUNT(?val) > 0)
结果:
{
'head': {
'vars': ['val', 'names']
},
'results': {
'bindings': []
}
}