【问题标题】:Are these two SPARQL 1.0 queries equivalent?这两个 SPARQL 1.0 查询是否等效?
【发布时间】:2020-06-19 10:41:37
【问题描述】:

我正在使用以下两个查询查询 Mulgara 三重存储,试图返回与某些值不匹配的主题。我仅限于 Mulgara 实现的 SPARQL 1.0 的任何部分,我很好奇这两个查询是否实际上相同,或者是否存在我在结果中看不到的行为差异。

提前感谢您的时间和帮助。

查询 1:

PREFIX fedora-model:        <info:fedora/fedora-system:def/model#>
PREFIX fedora-rels-ext: <info:fedora/fedora-system:def/relations-external#>

SELECT ?pids
FROM <#ri>
WHERE {
    { ?pids fedora-model:hasModel <info:fedora/islandora:sp_large_image_cmodel> }
    UNION
    { ?pids fedora-model:hasModel <info:fedora/islandora:bookCModel> }
    UNION
    { ?pids fedora-model:hasModel <info:fedora/islandora:collectionCModel> }
    UNION
    { ?pids fedora-model:hasModel <info:fedora/islandora:compoundCModel> }
    UNION
    { ?pids fedora-model:hasModel <info:fedora/islandora:sp-audioCModel> }
    UNION
    { ?pids fedora-model:hasModel <info:fedora/islandora:sp_videoCModel> }
    UNION
    { ?pids fedora-model:hasModel <info:fedora/islandora:sp_basic_image> }
    UNION
    { ?pids fedora-model:hasModel <info:fedora/islandora:sp_pdf> }
    UNION
    { ?pids fedora-model:hasModel <info:fedora/islandora:oralhistoriesCModel> }
}

和查询 2:

PREFIX fedora-model:     <info:fedora/fedora-system:def/model#>
PREFIX fedora-rels-ext:  <info:fedora/fedora-system:def/relations-external#>

SELECT ?pids
FROM <#ri>
WHERE {
  ?pids fedora-model:hasModel ?models .
  FILTER (!regex(str(?models), "pageCModel") &&
          !regex(str(?models), "FedoraObject-3.0") &&
          !regex(str(?models), "transformCModel") &&
          !regex(str(?models), "ContentModel-3.0")) .
}

【问题讨论】:

  • 你所说的“等效”是什么意思?我的意思是,两个查询可能返回相同的结果集,但显然我们确实知道数据,因此,我们无法判断您的基于 regex 的排除是否排除了所有其他模型。此外,我不明白您为什么使用regex 而不是使用URI,即FILTER (?models != &lt;info:fedora/pageCModel&gt; &amp;&amp; ... ) - 为什么您决定在这里的URI 上使用regex?关于性能,第二个查询进行全面扫描,而第一个查询将能够使用 pos 索引(如果存在,我根本不知道 Mulgara 三重存储)
  • @UninformedUser - 很好,非常感谢您的回复。我应该包含数据,但我认为您指出了一个更大的问题:我没有意识到我可以在 ?models 和 URI 上使用 =!=。感谢您的帮助!

标签: sparql


【解决方案1】:

一般来说,不,这些是不等价的。部分原因包括:

  • 前者有一个明确的模型值列表包含,而后者试图排除值。根据数据的不同,这两个查询可能会返回非常不同的结果
  • 后一个查询对 ?models 的字符串值使用 REGEX,但没有:
    • 验证 ?models 的值是否为 IRI(例如,它可以是满足过滤条件的文字)
    • 验证 REGEX 在字符串末尾是否匹配(我认为这是本意)

正如上面已经提到的评论,使用 REGEX 也可能会对查询性能产生重大影响。

【讨论】:

    【解决方案2】:

    确定查询是否等效的唯一方法是运行“探索性”查询。

    这是一个查询,可以找出那里的所有模型:

    SELECT distinct ?models FROM <#ri> WHERE 
    { ?pids fedora-model:hasModel ?models}
    

    有了它,您将拥有所有模型。然后,您可以找出是否缺少指定任何其他模型。

    使用“=”的替代方法是使用 sameTerm 函数。 sameTerm 函数适用于 IRI,而 '=' 也比较字符串和文字。使用 sameTerm 的响应时间会稍微好一些。

    PREFIX fedora-model:     <info:fedora/fedora-system:def/model#>
    PREFIX fedora-rels-ext:  <info:fedora/fedora-system:def/relations-external#>
    SELECT ?pids
    FROM <#ri>
    WHERE {
      ?pids fedora-model:hasModel ?models .
      FILTER (!sameTerm(?models, <info:fedora/islandora:pageCModel> ) &&
              !sameTerm(?models, <info:fedora/islandora:pageCModel> )) 
    }
    

    【讨论】:

      猜你喜欢
      • 2015-05-28
      • 1970-01-01
      • 2020-11-23
      • 2013-10-12
      • 1970-01-01
      • 2012-09-18
      • 1970-01-01
      • 2016-04-28
      • 2023-03-27
      相关资源
      最近更新 更多