如何使用 SPARQL 查询查找资源的下一个最大值
How to find the next biggest value of a resource with a SPARQL query
我无法解决以下问题:
"Construct a graph with the apoapsis of each planet together with a reference to the planet that comes next with regard to its distance from the sun."
这是图表的转储:
:Saturn
skos:exactMatch dbr:Saturn;
rdf:type dbo:Planet;
v:orbits :Sun;
v:apoapsis [rdf:value 9.0412; v:uom unit:AU] ;
v:orbitalPeriod [rdf:value 29.45; v:uom unit:YR ];
v:radius [rdf:value 60268; v:uom unit:KM] ;
v:temperature
[rdf:value -139;
v:uom unit:Deg_C ];
.
图中是关于太阳系的一些数据。所有行星 (dbo:Planet) 都有 v:apoapsis 属性 和一个告诉太阳距离的值。我已经想出如何找到所有更大的值,但我只想要下一个最大的值。结果如下所示:
:Mars v:apoapsis 1.666 ;
v:nextPlanet :Saturn , :Jupiter , :Uranus .
:Mercury v:apoapsis 0.467 ;
v:nextPlanet :Saturn , :Jupiter , :Uranus , :Mars , :Earth , :Venus .
:Earth v:apoapsis 1.017 ;
v:nextPlanet :Saturn , :Jupiter , :Uranus , :Mars .
:Venus v:apoapsis 0.728 ;
v:nextPlanet :Saturn , :Jupiter , :Uranus , :Mars , :Earth .
:Jupiter v:apoapsis 5.4588 ;
v:nextPlanet :Saturn , :Uranus .
:Saturn v:apoapsis 9.0412 ;
v:nextPlanet :Uranus .
预期结果应如下所示:
:Mars v:apoapsis 1.666 ;
v:nextPlanet :Jupiter .
:Mercury v:apoapsis 0.467 ;
v:nextPlanet :Venus .
:Uranus v:apoapsis 20.11 ;
v:nextPlanet :Neptune .
我是 SPARQL 的新手,对为此类任务迭代元素的想法感到厌烦。不需要完整的解决方案我只是想知道如何解决这个问题,我很高兴有一些想法。谢谢。
我最突出的查询如下所示:
CONSTRUCT{?planet v:apoapsis ?AUdist;
v:nextPlanet ?nextPlanet .}
WHERE {
?planet a dbo:Planet.
?planet v:apoapsis ?dist.
?dist v:uom unit:AU;
rdf:value ?AUdist .
FILTER(?AUdist > ?AUdist2)
{
SELECT ?nextPlanet ?AUdist2
WHERE {
?nextPlanet a dbo:Planet.
?nextPlanet v:apoapsis ?dist2.
?dist2 v:uom unit:AU;
rdf:value ?AUdist2 .
}
ORDER BY ASC(?AUdist2)
}
{
}
}ORDER BY ASC(?AUdist)
思路是在子查询中获取最小距离值,然后在外层查询中获取对应的行星:
CONSTRUCT {
?planet v:apoapsis ?dist;
v:nextPlanet ?nextPlanet .
} WHERE {
?planet v:apoapsis ?dist ;
v:nextPlanet ?nextPlanet .
?nextPlanet v:apoapsis ?nextDist
BIND(abs(?dist - ?nextDist) as ?diff)
FILTER(?diff = ?minDiff)
# get planet and the minimum distance to its next planet
{
SELECT ?planet (min(?diff) as ?minDiff) {
?planet v:apoapsis ?dist ;
v:nextPlanet/v:apoapsis ?nextDist
BIND(abs(?dist - ?nextDist) as ?diff)
} GROUP BY ?planet
}
}
请注意,此处的查询从您的中间结果开始。您没有共享全部数据,因此,我必须测试从您那里得到的数据。
此类查询的一般方法是:
- 获取value1和value2的所有组合
- 只保留 value1 小于 value2 的那些组合
- 使用
GROUP BY
和 MIN
找到给定值 1 的最小值 2
您已经完成了第 1 步和第 2 步。要稍微重写您的查询:
SELECT * {
?planet v:apoapsis/rdf:value ?dist.
?otherPlanet v:apoapsis/rdf:value ?otherDist.
FILTER (?dist < ?otherDist)
}
现在在第 3 步中,我们要按 ?planet
分组,并在每个组中找到最小的 ?otherDist
:
SELECT ?planet (MIN(?otherDist) AS ?nextDist) {
?planet v:apoapsis/rdf:value ?dist.
?otherPlanet v:apoapsis/rdf:value ?otherDist.
FILTER (?dist < ?otherDist)
}
GROUP BY ?planet
这是困难的部分。剩下的就是将上面的查询变成 CONSTRUCT
查询中的子查询,找到 ?nextDist
对应的 ?nextPlanet
并构造目标图。
我无法解决以下问题: "Construct a graph with the apoapsis of each planet together with a reference to the planet that comes next with regard to its distance from the sun."
这是图表的转储:
:Saturn
skos:exactMatch dbr:Saturn;
rdf:type dbo:Planet;
v:orbits :Sun;
v:apoapsis [rdf:value 9.0412; v:uom unit:AU] ;
v:orbitalPeriod [rdf:value 29.45; v:uom unit:YR ];
v:radius [rdf:value 60268; v:uom unit:KM] ;
v:temperature
[rdf:value -139;
v:uom unit:Deg_C ];
.
图中是关于太阳系的一些数据。所有行星 (dbo:Planet) 都有 v:apoapsis 属性 和一个告诉太阳距离的值。我已经想出如何找到所有更大的值,但我只想要下一个最大的值。结果如下所示:
:Mars v:apoapsis 1.666 ;
v:nextPlanet :Saturn , :Jupiter , :Uranus .
:Mercury v:apoapsis 0.467 ;
v:nextPlanet :Saturn , :Jupiter , :Uranus , :Mars , :Earth , :Venus .
:Earth v:apoapsis 1.017 ;
v:nextPlanet :Saturn , :Jupiter , :Uranus , :Mars .
:Venus v:apoapsis 0.728 ;
v:nextPlanet :Saturn , :Jupiter , :Uranus , :Mars , :Earth .
:Jupiter v:apoapsis 5.4588 ;
v:nextPlanet :Saturn , :Uranus .
:Saturn v:apoapsis 9.0412 ;
v:nextPlanet :Uranus .
预期结果应如下所示:
:Mars v:apoapsis 1.666 ;
v:nextPlanet :Jupiter .
:Mercury v:apoapsis 0.467 ;
v:nextPlanet :Venus .
:Uranus v:apoapsis 20.11 ;
v:nextPlanet :Neptune .
我是 SPARQL 的新手,对为此类任务迭代元素的想法感到厌烦。不需要完整的解决方案我只是想知道如何解决这个问题,我很高兴有一些想法。谢谢。
我最突出的查询如下所示:
CONSTRUCT{?planet v:apoapsis ?AUdist;
v:nextPlanet ?nextPlanet .}
WHERE {
?planet a dbo:Planet.
?planet v:apoapsis ?dist.
?dist v:uom unit:AU;
rdf:value ?AUdist .
FILTER(?AUdist > ?AUdist2)
{
SELECT ?nextPlanet ?AUdist2
WHERE {
?nextPlanet a dbo:Planet.
?nextPlanet v:apoapsis ?dist2.
?dist2 v:uom unit:AU;
rdf:value ?AUdist2 .
}
ORDER BY ASC(?AUdist2)
}
{
}
}ORDER BY ASC(?AUdist)
思路是在子查询中获取最小距离值,然后在外层查询中获取对应的行星:
CONSTRUCT {
?planet v:apoapsis ?dist;
v:nextPlanet ?nextPlanet .
} WHERE {
?planet v:apoapsis ?dist ;
v:nextPlanet ?nextPlanet .
?nextPlanet v:apoapsis ?nextDist
BIND(abs(?dist - ?nextDist) as ?diff)
FILTER(?diff = ?minDiff)
# get planet and the minimum distance to its next planet
{
SELECT ?planet (min(?diff) as ?minDiff) {
?planet v:apoapsis ?dist ;
v:nextPlanet/v:apoapsis ?nextDist
BIND(abs(?dist - ?nextDist) as ?diff)
} GROUP BY ?planet
}
}
请注意,此处的查询从您的中间结果开始。您没有共享全部数据,因此,我必须测试从您那里得到的数据。
此类查询的一般方法是:
- 获取value1和value2的所有组合
- 只保留 value1 小于 value2 的那些组合
- 使用
GROUP BY
和MIN
找到给定值 1 的最小值 2
您已经完成了第 1 步和第 2 步。要稍微重写您的查询:
SELECT * {
?planet v:apoapsis/rdf:value ?dist.
?otherPlanet v:apoapsis/rdf:value ?otherDist.
FILTER (?dist < ?otherDist)
}
现在在第 3 步中,我们要按 ?planet
分组,并在每个组中找到最小的 ?otherDist
:
SELECT ?planet (MIN(?otherDist) AS ?nextDist) {
?planet v:apoapsis/rdf:value ?dist.
?otherPlanet v:apoapsis/rdf:value ?otherDist.
FILTER (?dist < ?otherDist)
}
GROUP BY ?planet
这是困难的部分。剩下的就是将上面的查询变成 CONSTRUCT
查询中的子查询,找到 ?nextDist
对应的 ?nextPlanet
并构造目标图。