我在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}
}
似乎两个查询都返回相同的结果。第一个查询中的和语句是否重要?我错过了什么吗?
答案 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 |
------------