【发布时间】:2015-12-14 06:02:30
【问题描述】:
我正在尝试运行以下 SPARQL 查询,但它一直返回 SR171: Transaction timed out。
SELECT ?isBusAvailable WHERE {
SELECT DISTINCT IF (
(
SELECT ?value2 WHERE {
GRAPH data: { ?obsValueID2 ontology:value ?value2 }
GRAPH data: { ?obsValueID2 rdf:label "Availability" }
GRAPH data: { ?obsValueID2 ontology:isObservedValueOf ?obsID2}
GRAPH data: { ?obsID2 ssn:observationResultTime ?time2 }
GRAPH data: { ?obsID2 ssn:observedBy ?id2 }
GRAPH meta: { ?id2 rdf:label "MyBusService" }
} ORDER BY DESC (?time2) LIMIT 1) > 1, "Take Bus", (
SELECT ?isBikeAvailable WHERE {
SELECT DISTINCT IF (
(
SELECT ?value3 WHERE {
GRAPH data: { ?obsValueID3 ontology:value ?value3 }
GRAPH data: { ?obsValueID3 rdf:label "Availability" }
GRAPH data: { ?obsValueID3 ontology:isObservedValueOf ?obsID3}
GRAPH data: { ?obsID3 ssn:observationResultTime ?time3 }
GRAPH data: { ?obsID3 ssn:observedBy ?id3 }
GRAPH meta: { ?id3 rdf:label "MyBikeService" }
} ORDER BY DESC (?time3) LIMIT 1
) > 0, "Take Bike", "Take Taxi") as ?isBikeAvailable WHERE { ?1 ?2 ?3}})) as ?isBusAvailable WHERE { ?4 ?5 ?6}}
如果我单独运行它们,它会在 1 秒内运行。以下示例有效。
SELECT ?isBusAvailable WHERE {
SELECT DISTINCT IF (
(
SELECT ?value2 WHERE {
GRAPH data: { ?obsValueID2 ontology:value ?value2 }
GRAPH data: { ?obsValueID2 rdf:label "Availability" }
GRAPH data: { ?obsValueID2 ontology:isObservedValueOf ?obsID2}
GRAPH data: { ?obsID2 ssn:observationResultTime ?time2 }
GRAPH data: { ?obsID2 ssn:observedBy ?id2 }
GRAPH meta: { ?id2 rdf:label "MyBusService" }
} ORDER BY DESC (?time2) LIMIT 1) > 1, "Take Bus", 'Take Bike') as ?isBusAvailable WHERE { ?4 ?5 ?6}}
如果第一次查询的结果为真,则返回'Take Bus';否则,运行第二个查询,并返回“Take Bike”或“Take Taxi”。
显然问题出在第二个查询上(来自第一个查询的错误条件)。在“乘坐巴士”之后,如果我将第二个查询更改为“乘坐自行车”,它就会起作用。
【问题讨论】:
-
根据sparql.org's query validator,这(无论执行多长时间)不是合法的 SPARQL 查询。这可能适用于您发布的答案。您是否考虑过重新定位查询?
-
没错。此问题中发布的查询语法不正确。这就是我的问题。我发布的答案中的查询有效。你能告诉我你所说的“重新定相”是什么意思吗?另外,请改进我发布的答案。
-
我的意思是,即使某些 SPARQL 引擎接受它,您答案中的语法也不是合法的 SPARQL 语法。例如,
select distinct if( ... )不是合法的 SPARQL。换句话说,我的意思是您应该考虑重组您的 SPARQL 查询,使其合法。一旦它是合法的,我们可以帮助它提高性能。此外,如果您能告诉我们查询试图完成什么以及数据是什么样的,这将有所帮助。 看起来查询可以写得更简单,但很难说,因为我们不知道它应该做什么。 -
我有两个服务:BusService 和 BikeService。该查询正在尝试检索总线的“可用”属性。如果有公共汽车,它将返回“Take Bus”。如果公共汽车不可用,请检查是否有可用的自行车。如果有可用的自行车返回“Take Bike”,否则返回“Take Taxi”。基本上,我有 2 个图表。一种是服务的元数据(即元数据:),另一种包含服务产生的数据(即示例中的数据:)。它从元数据中选择服务的 id 并检查数据图中的最后一个读数。
-
给定服务名称和我感兴趣的属性(例如,可用性),我想检索该服务的最后读数。根据返回的值,我想做出一些决定,如上所述。