【问题标题】:Why does SPARQL LIMIT on Inner Query seem to limit the outer query under RDF4J?为什么内部查询上的 SPARQL LIMIT 似乎限制了 RDF4J 下的外部查询?
【发布时间】:2017-11-15 11:13:36
【问题描述】:

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

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

  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:aTestObject1inst: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:aTestObject1inst:aTestObject2 各有一个结果,因为每个结果都有两个时间戳。但我只得到inst:aTestObject2 的结果。为什么只有一个?

【问题讨论】:

  • 希望你知道内部查询总是先执行
  • 如果你想让每个测试对象有一个时间戳,你必须在测试对象中使用GROUP BY,然后使用像SAMPLE这样的聚合函数
  • @AKSW,谢谢。我“知道”首先执行的内部查询,但我没有仔细考虑。所以,我会从你的第二条评论开始工作。如果我可以按照我想要的方式进行操作,我会将结果查询作为答案发布。
  • 好吧,酷!从您的回答中我可以看出您已经找到了解决方案。干杯!

标签: sparql rdf4j


【解决方案1】:

根据@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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多