这两个 SPARQL 1.0 查询是否等效?
Are these two SPARQL 1.0 queries equivalent?
我正在使用以下两个查询查询 Mulgara 三元组存储,试图 return 与某些值不匹配的主题。我仅限于 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")) .
}
一般来说,不,这些并不等同。部分原因包括:
- 前者有明确的模型值列表 include,而后者试图 exclude 值。根据数据,这两个查询可能 return 截然不同的结果
- 后一个查询在 ?models 的字符串值上使用了 REGEX,但没有:
- 验证 ?models 的值是否为 IRI(例如,它可以是满足过滤条件的文字)
- 验证 REGEX 是否匹配字符串的末尾(我想这是意图)
正如上面已经提到的评论,使用 REGEX 也可能会对查询性能产生重大影响。
确定查询是否等效的唯一方法是通过 运行 "exploratory" 查询。
这里是一个查询,用于找出那里的所有模型:
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> ))
}
我正在使用以下两个查询查询 Mulgara 三元组存储,试图 return 与某些值不匹配的主题。我仅限于 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")) .
}
一般来说,不,这些并不等同。部分原因包括:
- 前者有明确的模型值列表 include,而后者试图 exclude 值。根据数据,这两个查询可能 return 截然不同的结果
- 后一个查询在 ?models 的字符串值上使用了 REGEX,但没有:
- 验证 ?models 的值是否为 IRI(例如,它可以是满足过滤条件的文字)
- 验证 REGEX 是否匹配字符串的末尾(我想这是意图)
正如上面已经提到的评论,使用 REGEX 也可能会对查询性能产生重大影响。
确定查询是否等效的唯一方法是通过 运行 "exploratory" 查询。
这里是一个查询,用于找出那里的所有模型:
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> ))
}