【问题标题】:optimizing a SPARQL query when using a custom function in Jena在 Jena 中使用自定义函数时优化 SPARQL 查询
【发布时间】:2022-01-03 17:49:20
【问题描述】:

我在 Owl Ontology 上有以下 SPARQL 查询,使用 Jena:

SELECT ?label ?distance
WHERE {
  ?wpt rdf:type inav:Waypoint .
  ?wpt inav:Label ?label .
  ?ac  rdf:type inav:Aircraft .
  ?ac  inav:Label "myAircraft" .
  ?wpt inav:hasExactGeometry ?geom .
  ?geom inav:asWKT ?wkt .
  ?ac inav:hasExactGeometry ?geom2 .
  ?geom2 inav:asWKT ?wkt2 .
  BIND (geof:distance(?wkt, ?wkt2, <http://www.opengis.net/def/uom/OGC/1.0/nauticalMile>) as ?distance)
}
ORDER BY ASC(?distance )
LIMIT 1

这个想法是:

  • 我有一个名为“myAircraft”的Aircraft
  • 我有几个航点
  • 我使用 GeoSPARQL 搜索最近的 Waypoint
  • 我想返回最近的Waypoint的标签,它与“myAircraft”的距离Aircraft

这个查询没有任何问题。

现在我正在使用 Jena FunctionFactory 添加自定义词汇表。在我的情况下,我想实时检索在航路点位置以米为单位的气象可见度(举个例子)。为了做到这一点,我用一个 visibility 词创建了一个自定义词汇表。它只有一个参数,在我的例子中是WaypointLabel

然后我将查询更改如下:

SELECT ?label ?distance ?visibility
WHERE {
  ?wpt rdf:type inav:Waypoint .
  ?wpt inav:Label ?label .
  ?ac  rdf:type inav:Aircraft .
  ?ac  inav:Label "myAircraft" .
  ?wpt inav:hasExactGeometry ?geom .
  ?geom inav:asWKT ?wkt .
  ?ac inav:hasExactGeometry ?geom2 .
  ?geom2 inav:asWKT ?wkt2 .
  BIND (geof:distance(?wkt, ?wkt2, <http://www.opengis.net/def/uom/OGC/1.0/nauticalMile>) as ?distance)
  BIND (my:visibility(?wpt) as ?visibility)
}
ORDER BY ASC(?distance )
LIMIT 1

它也可以正常工作,但我在调试器中指出,Java visibility 函数在本体中的每个 Waypoint 都会被调用,而不仅仅是最接近的一个。如果我有很多航点,我将不得不为Waypoint 调用我的 Java 函数,而理想情况下我只想为其中一个,即最近的一个。

有没有办法加快查询速度? (想法是,在现实生活中,我会为我的 Waypoint 调用一个气象服务,但我不想为每个 Waypoint 都这样做,而只是我在查询中找到的那个)。

【问题讨论】:

  • 按强制顺序首先计算所有解决方案,然后根据 ĹIMIT 1´ 取第一个 - 您必须将初始查询放入子查询中,并在外部查询中应用您的自定义功能。或者你只是在投影部分使用你的函数
  • SELECT ?label ?distance (my:visibility(?wpt) AS ?visibility) WHERE { ?wpt rdf:type inav:Waypoint . ?wpt inav:Label ?label . ?ac rdf:type inav:Aircraft . ?ac inav:Label "myAircraft" . ?wpt inav:hasExactGeometry ?geom . ?geom inav:asWKT ?wkt . ?ac inav:hasExactGeometry ?geom2 . ?geom2 inav:asWKT ?wkt2 . BIND (geof:distance(?wkt, ?wkt2, &lt;http://www.opengis.net/def/uom/OGC/1.0/nauticalMile&gt;) as ?distance) } ORDER BY ASC(?distance ) LIMIT 1
  • SELECT ?label ?distance ?visibility {{SELECT ?label ?distance WHERE { ?wpt rdf:type inav:Waypoint . ?wpt inav:Label ?label . ?ac rdf:type inav:Aircraft . ?ac inav:Label "myAircraft" . ?wpt inav:hasExactGeometry ?geom . ?geom inav:asWKT ?wkt . ?ac inav:hasExactGeometry ?geom2 . ?geom2 inav:asWKT ?wkt2 . BIND (geof:distance(?wkt, ?wkt2, &lt;http://www.opengis.net/def/uom/OGC/1.0/nauticalMile&gt;) as ?distance) } ORDER BY ASC(?distance ) LIMIT 1} BIND (my:visibility(?wpt) as ?visibility)}
  • 顺便问一下,有什么理由不使用公共属性rdfs:label 当它是标准RDF 词汇表的一部分时,定义自己的标签属性有什么意义?
  • 而你添加的不是自定义词汇,而是自定义“功能”

标签: java sparql jena geosparql


【解决方案1】:

根据 UninformedUser 的信息丰富的回答:

SELECT ?label ?distance ?visibility  
{
   {SELECT ?label ?distance  
    WHERE {   
      ?wpt rdf:type inav:Waypoint .   
      ?wpt inav:Label ?label .  
      ?ac  rdf:type inav:Aircraft . 
      ?ac  inav:Label "myAircraft" . 
      ?wpt inav:hasExactGeometry ?geom .   
      ?geom inav:asWKT ?wkt .   
      ?ac inav:hasExactGeometry ?geom2 .   
      ?geom2 inav:asWKT ?wkt2 .   
      BIND (geof:distance(?wkt, ?wkt2, <http://www.opengis.net/def/uom/OGC/1.0/nauticalMile>) as ?distance)  
   } ORDER BY ASC(?distance ) LIMIT 1
}  BIND (my:visibility(?wpt) as ?visibility)
}

【讨论】:

    猜你喜欢
    • 2020-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多