1

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

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

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

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

    这会产生预期的四个结果(两个测试个体的时间戳): 第一次查询的结果符合预期

  5. 现在尝试使用以下包含内部查询的查询(第一个查询的简单扩展)将结果限制为每个人(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. 为什么只有一个?

4

1 回答 1

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

它返回所需的两个结果:

想要的查询结果

谢谢@AKSW。

于 2017-11-14T15:01:45.120 回答