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

为什么SPARQL对内部查询的限制似乎限制了RDF4J下的外部查询?,sparql,rdf4j,Sparql,Rdf4j,我在Windows10下使用RDF4J版本2.2.2工作台和服务器。我需要使用内部查询来限制结果。我的特殊应用是从一系列相关报告中积累事件概念。每个报表都有一个时间戳作为其属性之一。我需要一个带有LIMIT和orderby的内部查询,以从每个事件的报告中获取最新的时间戳。事件由外部查询中的三元组建立。由于完整的应用程序相当复杂,我提出了一个简单的案例来说明我的问题。基本上,我希望外部查询生成多个结果,内部查询限制为1,但限制似乎应用于外部查询。我想知道为什么我只得到一个结果,而我期望更多。在本例

我在Windows10下使用RDF4J版本2.2.2工作台和服务器。我需要使用内部查询来限制结果。我的特殊应用是从一系列相关报告中积累事件概念。每个报表都有一个时间戳作为其属性之一。我需要一个带有
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