【发布时间】:2017-11-15 11:13:36
【问题描述】:
我在 Windows 10 下使用 RDF4J 版本 2.2.2 工作台和服务器。我需要使用内部查询来限制结果。我的特殊应用是从一系列相关报告中积累事件概念。每个报告都有一个时间戳作为其属性之一。我需要带有LIMIT 和ORDER BY 的内部查询,以便从贡献每个事件的报告中获取最新时间戳。该事件由外部查询中的三元组建立。由于完整的应用程序相当复杂,我想出了一个简单的案例来说明我的问题。基本上,我期望外部查询产生几个结果,内部查询限制为 1,但 LIMIT 似乎适用于外部查询。我想知道为什么当我期望更多时我只得到一个结果。在此处的示例中,我希望得到两个结果,但只得到一个......
示例案例是在 RDF4J 工作台中使用支持 RDFS+SPIN 的存储库设置的。
- 清除存储库(RDF4J 工作台修改/清除)。
- 使用工作台修改/添加功能加载Nuvio本体版本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 { } -
现在使用 RDF4J Workbench 探索/查询功能运行以下 SPARQL 查询:
PREFIX Nuvio: <http://cogradio.org/ont/Nuvio.owl#> SELECT DISTINCT * WHERE { ?o a Nuvio:Quantity . ?o Nuvio:hasValue/Nuvio:hasDataValue ?value . } -
现在尝试使用以下包含内部查询(第一个查询的简单扩展)的查询将结果限制为每个人一个时间戳(
inst:aTestObject1和inst:aTestObject2):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 } }只产生一个结果:
我期待两个结果,
inst:aTestObject1和inst:aTestObject2各有一个结果,因为每个结果都有两个时间戳。但我只得到inst:aTestObject2的结果。为什么只有一个?
【问题讨论】:
-
希望你知道内部查询总是先执行?
-
如果你想让每个测试对象有一个时间戳,你必须在测试对象中使用
GROUP BY,然后使用像SAMPLE这样的聚合函数 -
@AKSW,谢谢。我“知道”首先执行的内部查询,但我没有仔细考虑。所以,我会从你的第二条评论开始工作。如果我可以按照我想要的方式进行操作,我会将结果查询作为答案发布。
-
好吧,酷!从您的回答中我可以看出您已经找到了解决方案。干杯!