这两个SPARQL 1.0查询等效吗?

这两个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

我用以下两个查询查询一个Mulgara triple store,试图返回与某些值不匹配的主题。我仅限于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> }
}
前缀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-非常感谢您的回复。我应该包括数据,但我认为您指出了一个更大的问题:我没有意识到我可以使用
=
=。谢谢你的帮助!“等价物”是什么意思?我的意思是,两个查询可能返回相同的结果集,但显然我们不知道数据,因此,我们无法判断基于
regex
的排除是否排除了所有其他模型。此外,我不明白为什么您使用
regex
而不是使用URI,即
FILTER(?models!=&&&&…)
-为什么您决定在URI上使用
regex
?关于性能,第二个查询进行完整扫描,而第一个查询将能够使用
pos
索引(如果存在,我根本不知道Mulgara triple store)@unformedUser-非常感谢您的回复。我应该包括数据,但我认为你指出了一个更大的问题:我没有意识到这一点