没有预先聚合的结果时SPARQL聚合行为

时间:2018-06-05 11:24:08

标签: database sparql rdf graph-theory

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

当有1+个结果(在聚合之前)之后,一切都按照我的预期运行,并且与我在SQL中得到的结果相同。如果有0个结果,我会得到一个包含单个空绑定[{}]的响应,而我所期望的结果是[]没有结果。这在SQL中引起了我的注意,这将导致零行。

  1. 我似乎无法找到有关原因的信息,所以如果有人能指出一些有用的信息。
  2. HAVING字段中添加至少需要一个结果的group by条款是最佳解决方案吗?
  3. 一个例子:

    数据:

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

0 个答案:

没有答案