如何使用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。