MarkLogic:在SPARQL查询中使用聚合函数

时间:2017-07-18 15:57:07

标签: sparql marklogic semantics

我在marklogic学习资料中找到了以下查询:

PREFIX mo: <http://mlu.marklogic.com/ontology/> 
SELECT ?country ?max 
FROM <http://mlu.marklogic.com/populations> 
WHERE { 
        { 
          SELECT (MAX(?pop) as ?max) 
          WHERE {?country mo:population ?pop} 
        } 
        { 
          ?country mo:population ?pop . ?country mo:population ?max 
        }
}

我将其替换为:

select ?country ?max
from <http://mlu.marklogic.com/populations>
where{
    {
      select (MAX(?pop) as ?max)
      where {?country mo:population ?pop}
    }
    {?country mo:population ?max}
  }

似乎两个查询都返回相同的结果。第一个查询中的和语句是否重要?我错过了什么吗?

1 个答案:

答案 0 :(得分:3)

这实际上是一个奇怪的例子,差别并不明显,但有一个。首先让我们获取一些样本数据,我们将包含一个具有多个人口价值的国家。

样本数据

@prefix : <urn:ex:>

:a :pop 200 .
:b :pop 300 .
:c :pop 400 .
:d :pop 500 . # d has two population values
:d :pop 600 .
:e :pop 400 .
:f :pop 600 . # f also has a maximum population

您的查询

现在,通过您的查询,您将获得碰巧拥有最大人口数量的国家/地区。可能不止一个。你匹配三个?country:population MAX_POPULATION ,对于每个?country和MAX_POPULATION,这个三元组是存在还是不存在。 RDF没有“重复的三元组”或类似的东西,所以每个国家都在里面或外面。

prefix : <urn:ex:>

select ?c ?max {
  { select (max(?pop) as ?max) { ?c :pop ?pop } }
  { ?c :pop ?max }
}
------------
| c  | max |
============
| :f | 600 |
| :d | 600 |
------------

他们的查询

现在,通过他们的查询,您仍然可以获得每个人口最多的国家,但是还有一个额外的变量。即使?country:population MAX_POPULATION 只有一种匹配方式,?country:population?population 可能有更多方法。

prefix : <urn:ex:>

select ?c ?max {
  { select (max(?pop) as ?max) { ?c :pop ?pop } }
  { ?c :pop ?max . ?c :pop ?pop }
}
------------
| c  | max |
============
| :f | 600 |
| :d | 600 |
| :d | 600 |
------------