sparql - 如何使用 SPARQL 查询查找资源的下一个最大值

标签 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: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
  }
}

请注意,此处的查询从您的中间结果开始。您没有共享全部数据,因此,我必须测试从您那里得到的数据。

关于sparql - 如何使用 SPARQL 查询查找资源的下一个最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55484245/

相关文章:

node.js - 将远程 sparql 端点 json 结果转换为 JSON-LD

xml - 如何使用 SWI-Prolog 从 OWL RDF/XML 查询个体的对象属性?

sparql - Sesame SPARQL 端点只读

rdf - 引用 owl :oneOf enumeration 中的实例

sparql - 带有性别词尾变化的 RDF 语言标签

java - 针对 Jena 数据集默认图的 SPARQL 查询

java - 从 jena QuerySolution 到 Model tdb rdf

sparql - 使用 sparql 生成带有子图的图

date - 在 SPARQL 中按月对数据进行分组?

linux - 在 Fuseki 服务器上启用 HTTPS/SSL?