首页 > 解决方案 > 没有预聚合结果时的 SPARQL 聚合行为

问题描述

当聚合零结果时,我对 SPARQL 聚合的行为感到惊讶。

当有 1+ 个结果(聚合之前)时,一切都会按我的预期工作,并且与我在 SQL 中得到的结果相同。但是,如果有 0 个结果,我会收到一个包含单个空绑定的响应,而[{}]我所期望的是根本没有结果[]。这让我像在 SQL 中一样,这将导致零行。

  1. 我似乎找不到任何关于为什么会这样的信息,所以如果有人能指出一些有用的信息。
  2. 在我的领域中添加一个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'
                }
            }
        ]
    }
}

但是,如果我要添加一个正在寻找val3 的子句,那么预聚合结果为零。

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': []
    }
}

标签: databasesparqlrdfgraph-theory

解决方案


推荐阅读