database - 没有预聚合结果时的 SPARQL 聚合行为
问题描述
当聚合零结果时,我对 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': []
}
}
解决方案
推荐阅读
- windows - 如何通过快捷方式显示/隐藏 Intellij IDEA 窗口?
- c# - Azure DevOps Rest API - 如何在工作项中获取分配的用户显示名称
- python - Geoviews 错误:“提供的数据不包含指定的维度”
- excel - 字符串中数字字符数的数据验证
- ios - Flutter 无法在任何 iOS 设备上注册纹理
- java - 在 Spring Boot 中,静态内容通过管理服务器端口而不是服务器端口提供服务
- python - Pylance 未定义“登录”(网络抓取)
- javascript - 如何对数据表中的 2 行进行任何乘法或任何数学运算
- vue.js - 如何使用 Vuejs 显示数组列表
- reactjs - Reactjs 获取输入时间值 onchange