为什么SPARQL对内部查询的限制似乎限制了RDF4J下的外部查询?
我在Windows10下使用RDF4J版本2.2.2工作台和服务器。我需要使用内部查询来限制结果。我的特殊应用是从一系列相关报告中积累事件概念。每个报表都有一个时间戳作为其属性之一。我需要一个带有为什么SPARQL对内部查询的限制似乎限制了RDF4J下的外部查询?,sparql,rdf4j,Sparql,Rdf4j,我在Windows10下使用RDF4J版本2.2.2工作台和服务器。我需要使用内部查询来限制结果。我的特殊应用是从一系列相关报告中积累事件概念。每个报表都有一个时间戳作为其属性之一。我需要一个带有LIMIT和orderby的内部查询,以从每个事件的报告中获取最新的时间戳。事件由外部查询中的三元组建立。由于完整的应用程序相当复杂,我提出了一个简单的案例来说明我的问题。基本上,我希望外部查询生成多个结果,内部查询限制为1,但限制似乎应用于外部查询。我想知道为什么我只得到一个结果,而我期望更多。在本例
LIMIT
和orderby
的内部查询,以从每个事件的报告中获取最新的时间戳。事件由外部查询中的三元组建立。由于完整的应用程序相当复杂,我提出了一个简单的案例来说明我的问题。基本上,我希望外部查询生成多个结果,内部查询限制为1,但限制似乎应用于外部查询。我想知道为什么我只得到一个结果,而我期望更多。在本例中,我期望得到两个结果,但只得到一个
示例案例是在RDF4J工作台中使用支持RDFS+SPIN的存储库设置的
清除存储库(RDF4J工作台修改/清除)
使用工作台修改/添加功能加载本体版本1.0.0
使用RDF4J Modify/SPARQL update函数,使用以下SPARQL更新查询设置测试条件
PREFIX Nuvio: <http://cogradio.org/ont/Nuvio.owl#>
PREFIX inst: <http://www.disa.mil/dso/a2i/ontologies/PBSM/Sharing/Instantiations#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
INSERT {
inst:aTestObject1 Nuvio:hasValue _:b0 ;
Nuvio:hasValue _:b1 .
inst:aTestObject2 Nuvio:hasValue _:b2 ;
Nuvio:hasValue _:b3 .
_:b0 Nuvio:hasDataValue "2017-11-13T13:46:00.000-06:00"^^xsd:dateTime .
_:b1 Nuvio:hasDataValue "2017-11-13T13:46:01.000-06:00"^^xsd:dateTime .
_:b2 Nuvio:hasDataValue "2017-11-13T13:46:02.000-06:00"^^xsd:dateTime .
_:b3 Nuvio:hasDataValue "2017-11-13T13:46:03.000-06:00"^^xsd:dateTime .
}
WHERE {
}
它只产生一个结果:
我期望得到两个结果,分别对应于inst:aTestObject1
和inst:aTestObject2
,因为每个都有两个时间戳。但是我只得到inst:aTestObject2
的一个结果。为什么只有一个
根据@AKSW的评论,内部选择总是首先进行评估,然后从我的大脑衰退中恢复,我想要的解决方案(每个测试对象都有最新的
xsd:dateTime
值)可以通过以下简单的查询来实现
PREFIX Nuvio: <http://cogradio.org/ont/Nuvio.owl#>
SELECT DISTINCT ?o (MAX(?value) as ?maxValue)
WHERE {
?o a Nuvio:Quantity .
?o Nuvio:hasValue/Nuvio:hasDataValue ?value .
} GROUP BY ?o
前缀Nuvio:
选择不同的?o(最大(?值)作为?最大值)
在哪里{
?o a Nuvio:数量。
o Nuvio:hasValue/Nuvio:hasDataValue?值。
}B组?o
返回所需的两个结果:
谢谢@AKSW。我希望您知道,内部查询总是首先执行的?如果您希望每个测试对象有一个时间戳,您必须使用
按测试对象分组,然后使用像SAMPLE
@AKSW这样的聚合函数,谢谢。我“知道”首先执行内部查询,但我没有仔细考虑。所以,我将从你的第二个评论开始。如果我能以我想要的方式工作,我会将结果查询作为答案发布。好的,酷!从你的回答中我可以看出你已经找到了解决办法。干杯
PREFIX Nuvio: <http://cogradio.org/ont/Nuvio.owl#>
SELECT DISTINCT *
WHERE {
?o a Nuvio:Quantity .
{
SELECT DISTINCT *
WHERE {
?o Nuvio:hasValue/Nuvio:hasDataValue ?value .
} LIMIT 1
}
}
PREFIX Nuvio: <http://cogradio.org/ont/Nuvio.owl#>
SELECT DISTINCT ?o (MAX(?value) as ?maxValue)
WHERE {
?o a Nuvio:Quantity .
?o Nuvio:hasValue/Nuvio:hasDataValue ?value .
} GROUP BY ?o