如何使用SPARQL查询查找资源的下一个最大值
我无法解决以下问题: 构建一个包含每颗行星的远点的图表,并参考下一颗行星与太阳的距离 下面是图表的转储:如何使用SPARQL查询查找资源的下一个最大值,sparql,rdf,Sparql,Rdf,我无法解决以下问题: 构建一个包含每颗行星的远点的图表,并参考下一颗行星与太阳的距离 下面是图表的转储: :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
: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 .
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)
预期结果应如下所示:
: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 .
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)
我对SPARQL有点陌生,对于为这种任务迭代元素的想法我觉得很糟糕。一个完整的解决方案是没有必要的,我只是想知道如何解决这个问题,我对一些想法感到高兴。多谢各位
我最突出的问题如下所示:
: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 .
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)
其思想是在子查询中获取最小距离值,然后在外部查询中获取相应的行星: 构造{ 行星五:远点距离; v:nextPlanet?nextPlanet。 }在哪里{ 行星五:远点距离; v:nextPlanet?nextPlanet。 ?下一个计划五:apoapsis?下一个计划 BINDabs?dist-?nextist as?diff 过滤器?差异=?minDiff 获取行星及其到下一颗行星的最小距离 { 选择行星最小差异作为minDiff{ 行星五:远点距离; v:nextPlanet/v:apoapsis?nextlist BINDabs?dist-?nextist as?diff }按行星分组 } }
注意,这里的查询从中间结果开始。你没有分享全部数据,因此,我不得不测试从你那里得到的信息 此类查询的一般方法是: 获取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)
}
这是最难的部分。剩下的是将上面的查询转换为构造查询中的子查询,该子查询将查找对应于?nextList的?nextPlanet并构造目标图。谢谢。我所需要做的就是添加过滤器?星球!=?nextPlanet&&?dist<?NextList在下面的select语句中,以避免“?Plane”和“nextPlanet”是同一个Ressource。