这两个SPARQL 1.0查询等效吗?
我用以下两个查询查询一个Mulgara triple store,试图返回与某些值不匹配的主题。我仅限于Mulgara实现的SPARQL 1.0的任何部分,我很好奇这两个查询是否实际上是相同的,或者是否存在我在结果中看不到的行为差异 提前感谢您的时间和帮助 问题1:这两个SPARQL 1.0查询等效吗?,sparql,Sparql,我用以下两个查询查询一个Mulgara triple store,试图返回与某些值不匹配的主题。我仅限于Mulgara实现的SPARQL 1.0的任何部分,我很好奇这两个查询是否实际上是相同的,或者是否存在我在结果中看不到的行为差异 提前感谢您的时间和帮助 问题1: PREFIX fedora-model: <info:fedora/fedora-system:def/model#> PREFIX fedora-rels-ext: <info:fedora/fed
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> }
}
前缀fedora型号:
前缀fedora rels ext:
选择?pids
从…起
在哪里{
{?pids fedora模型:hasModel}
联合
{?pids fedora模型:hasModel}
联合
{?pids fedora模型:hasModel}
联合
{?pids fedora模型:hasModel}
联合
{?pids fedora模型:hasModel}
联合
{?pids fedora模型:hasModel}
联合
{?pids fedora模型:hasModel}
联合
{?pids fedora模型:hasModel}
联合
{?pids fedora模型:hasModel}
}
和问题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")) .
}
前缀fedora型号:
前缀fedora rels ext:
选择?pids
从…起
在哪里{
?pids fedora型号:hasModel?型号。
过滤器(!regex(str(?models),“pageCModel”)&&
!regex(str(?models),“FedoraObject-3.0”)&&
!regex(str(?models),“transformCModel”)&&
!regex(str(?models),“ContentModel-3.0”))。
}
一般来说,不,它们不是等价的。其中一些原因包括:
- 前者有一个要包含的模型值的显式列表,而后者则试图排除这些值。根据数据的不同,这两个查询可能返回非常不同的结果
- 后一个查询对?models的字符串值使用正则表达式,但不:
- 验证?models的值是否为IRI(例如,它可以是满足筛选条件的文本)
- 验证正则表达式在字符串末尾是否匹配(我认为这是目的)
正如上面已经提到的一条评论,REGEX的使用可能也会对查询性能产生重大影响。一般来说,不,它们是不等价的。其中一些原因包括:
- 前者有一个要包含的模型值的显式列表,而后者则试图排除这些值。根据数据的不同,这两个查询可能返回非常不同的结果
- 后一个查询对?models的字符串值使用正则表达式,但不:
- 验证?models的值是否为IRI(例如,它可以是满足筛选条件的文本)
- 验证正则表达式在字符串末尾是否匹配(我认为这是目的)
正如上面已经提到的一条评论,REGEX的使用可能也会对查询性能产生重大影响。确定查询是否等效的唯一方法是运行“探索性”查询 下面是一个查询,用于查找那里的所有模型:
SELECT distinct ?models FROM <#ri> WHERE
{ ?pids fedora-model:hasModel ?models}
从何处选择不同的型号
{?pids fedora模型:hasModel?模型}
有了这个,你将拥有所有的模型。然后,您可以找出是否缺少指定任何其他模型
使用“=”的替代方法是使用sameTerm函数。sameTerm函数在IRIs上工作,而“=”也比较字符串和文本。使用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> ))
}
前缀fedora型号:
前缀fedora rels ext:
选择?pids
从…起
在哪里{
?pids fedora型号:hasModel?型号。
过滤器(!sameTerm(?models,)&&
!sameTerm(?models,))
}
确定查询是否等效的唯一方法是运行“探索性”查询
下面是一个查询,用于查找那里的所有模型:
SELECT distinct ?models FROM <#ri> WHERE
{ ?pids fedora-model:hasModel ?models}
从何处选择不同的型号
{?pids fedora模型:hasModel?模型}
有了这个,你将拥有所有的模型。然后,您可以找出是否缺少指定任何其他模型
使用“=”的替代方法是使用sameTerm函数。sameTerm函数在IRIs上工作,而“=”也比较字符串和文本。使用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> ))
}
前缀fedora型号:
前缀fedora rels ext:
选择?pids
从…起
在哪里{
?pids fedora型号:hasModel?型号。
过滤器(!sameTerm(?models,)&&
!sameTerm(?models,))
}
你所说的“同等”是什么意思?我的意思是,两个查询可能返回相同的结果集,但显然我们不知道数据,因此,我们无法判断基于regex
的排除是否排除了所有其他模型。此外,我不明白为什么您使用regex
而不是使用URI,即FILTER(?models!=&&&&…)
-为什么您决定在URI上使用regex
?关于性能,第二个查询进行完整扫描,而第一个查询将能够使用pos
索引(如果存在,我根本不知道Mulgara triple store)@unformedUser-非常感谢您的回复。我应该包括数据,但我认为您指出了一个更大的问题:我没有意识到我可以使用=
或=型号和URI上的代码>。谢谢你的帮助!“等价物”是什么意思?我的意思是,两个查询可能返回相同的结果集,但显然我们不知道数据,因此,我们无法判断基于regex
的排除是否排除了所有其他模型。此外,我不明白为什么您使用regex
而不是使用URI,即FILTER(?models!=&&&&…)
-为什么您决定在URI上使用regex
?关于性能,第二个查询进行完整扫描,而第一个查询将能够使用pos
索引(如果存在,我根本不知道Mulgara triple store)@unformedUser-非常感谢您的回复。我应该包括数据,但我认为你指出了一个更大的问题:我没有意识到这一点