在 Jena 中使用自定义函数时优化 SPARQL 查询
optimizing a SPARQL query when using a custom function in Jena
我在 Owl Ontology 上使用 Jena 进行以下 SPARQL 查询:
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
想法是:
- 我有一个
Aircraft
叫做“myAircraft”
- 我有几个Waypoints
- 我使用 GeoSPARQL
搜索最近的 Waypoint
- 我要return最近的标签
Waypoint
,它到“myAircraft”的距离Aircraft
这个查询没有任何问题。
现在我正在使用 Jena FunctionFactory
添加自定义词汇表。就我而言,我想实时检索航路点位置处以米为单位的气象能见度(举个例子)。为此,我创建了一个包含一个 visibility
单词的自定义词汇表。它只有一个参数,在我的例子中是 Waypoint
的 Label
。
然后我将查询更改如下:
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
它也可以正常工作,但我在我的调试器中指出,Ontology 中的每个 Waypoint
都会调用 Java visibility
函数,不仅如此最近的一个。如果我有很多 waypoints,我将不得不为 Waypoint
调用我的 Java 函数,而理想情况下我只想对其中一个,即最近的一个执行此操作。
有没有办法加快这个查询的速度? (这个想法是,在现实生活中,我会为我的 Waypoint 调用气象服务,但我不想为每个 Waypoint
都这样做,而只是我在查询中找到的一个)。
根据 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)
}
我在 Owl Ontology 上使用 Jena 进行以下 SPARQL 查询:
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
想法是:
- 我有一个
Aircraft
叫做“myAircraft” - 我有几个Waypoints
- 我使用 GeoSPARQL 搜索最近的
- 我要return最近的标签
Waypoint
,它到“myAircraft”的距离Aircraft
Waypoint
这个查询没有任何问题。
现在我正在使用 Jena FunctionFactory
添加自定义词汇表。就我而言,我想实时检索航路点位置处以米为单位的气象能见度(举个例子)。为此,我创建了一个包含一个 visibility
单词的自定义词汇表。它只有一个参数,在我的例子中是 Waypoint
的 Label
。
然后我将查询更改如下:
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
它也可以正常工作,但我在我的调试器中指出,Ontology 中的每个 Waypoint
都会调用 Java visibility
函数,不仅如此最近的一个。如果我有很多 waypoints,我将不得不为 Waypoint
调用我的 Java 函数,而理想情况下我只想对其中一个,即最近的一个执行此操作。
有没有办法加快这个查询的速度? (这个想法是,在现实生活中,我会为我的 Waypoint 调用气象服务,但我不想为每个 Waypoint
都这样做,而只是我在查询中找到的一个)。
根据 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)
}