为什么内部查询上的SPARQL LIMIT似乎限制了RDF4J下的外部查询?

时间:2017-11-14 00:05:27

标签: sparql rdf4j

我在Windows 10下使用RDF4J 2.2.2工作台和服务器。我需要使用内部查询来限制结果。我的特定应用是从一系列相关报告中累积事件概念。每个报告都有一个时间戳作为其属性之一。我需要使用LIMITORDER BY的内部查询来获取每个事件的报告中的最新时间戳。该事件由外部查询中的三元组建立。由于完整的应用程序相当复杂,我想出了一个简单的案例来说明我的问题。基本上,我期望外部查询产生几个结果,内部查询限制为1,但LIMIT似乎应用于外部查询。我想知道为什么当我期待更多的时候我只得到一个结果。在这里的示例中,我期望两个结果,但只得到一个...

示例案例在RDF4J工作台中使用具有RDFS + SPIN支持的存储库进行设置。

  1. 清除存储库(RDF4J工作台修改/清除)。
  2. 使用工作台修改/添加功能
  3. 加载Nuvio本体版本1.0.0
  4. 使用RDF4J修改/ SPARQL更新功能,使用以下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 {
    }
    
  5. 现在使用RDF4J Workbench Explore / Query功能运行以下SPARQL查询:

    PREFIX Nuvio: <http://cogradio.org/ont/Nuvio.owl#>
    
    SELECT DISTINCT *
    WHERE {
      ?o a Nuvio:Quantity .
      ?o Nuvio:hasValue/Nuvio:hasDataValue ?value .
    }
    

    产生预期的四个结果(两个测试人员的两个时间戳): Results as expected from first query

  6. 现在尝试使用包含内部查询(第一个查询的简单扩展)的以下查询将结果限制为每个人(inst:aTestObject1inst:aTestObject2)的一个时间戳:< / p>

    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
      }
    }
    

    只产生一个结果:

    unexpected single result from second query when two results expected

    我期待两个结果,每个inst:aTestObject1inst:aTestObject2一个,因为每个结果都有两个时间戳。但我只得到inst:aTestObject2的结果。为什么只有一个?

1 个答案:

答案 0 :(得分:2)

按照@ 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

返回所需的两个结果:

desired query results

谢谢@AKSW。