dc:Creator SPARQL 中的字符串文字与正则表达式过滤器

dc:Creator string literal vs. regex FILTER in SPARQL

我正在使用 Europeana's Virtuoso SPARQL Endpoint

我一直在尝试在 SPARQL 中搜索有关特定贡献者的内容。据我了解,这可以通过以下方式进行:

PREFIX dc: <http://purl.org/dc/elements/1.1/>
SELECT ?title 
WHERE {
     ?objectInfo dc:title ?title .
     ?objectInfo dc:creator 'Picasso' .

}

尽管如此,我在 return 中什么也没得到。

或者,我使用 FILTER regex 来搜索文字。

PREFIX dc: <http://purl.org/dc/elements/1.1/>
SELECT ?title ?creator
WHERE {
     ?objectInfo dc:title ?title .
     ?objectInfo dc:creator ?creator .
     FILTER regex(?creator, 'Picasso')
}

这实际上工作得很好并且 return正确地编辑了结果。

我的问题是:是否可以在不使用 FILTER 搜索特定艺术家的作品的情况下生成 SPARQL 查询?

非常感谢。

1) 您的第一个查询具有未连接的三重模式。

2) 我猜,根据 the vocabulary descriptiondc:creator 需要一个资源,即 URI。使用实体 Picasso 的 URI 不起作用?

+--------------------+------------------------------------------------------------------------------------------------------------------------------------------------+
| Term Name: creator |                                                                                                                                                |
| URI:               | http://purl.org/dc/elements/1.1/creator                                                                                                        |
| Label:             | Creator                                                                                                                                        |
| Definition:        | An entity primarily responsible for making the resource.                                                                                       |
| Comment:           | Examples of a Creator include a person, an organization, or a service. Typically, the name of a Creator should be used to indicate the entity. |
+--------------------+------------------------------------------------------------------------------------------------------------------------------------------------+

最好查看您的数据以确定是否需要对文字进行 FILTER。

我不认为有任何对象 'Picasso' 字面上是创建者。 所以正则表达式过滤器是一个不错的选择,但是速度很慢。

这是一种查找正则表达式匹配的字符串的方法:

PREFIX dc: <http://purl.org/dc/elements/1.1/>
SELECT ?creator, (count(?creator) as ?ccount)
WHERE {
     ?objectInfo dc:title ?title .
     ?objectInfo dc:creator ?creator .
     FILTER regex(?creator, 'Picasso')
}
group by ?creator
order by ?ccount

如果您在 select 语句中显示了所有变量,您可能会更容易看到:

PREFIX dc: <http://purl.org/dc/elements/1.1/>
SELECT *
WHERE {
     ?objectInfo dc:title ?title .
     ?objectInfo dc:creator ?creator .
     FILTER regex(?creator, 'Picasso')
}

如果您不想使用正则表达式过滤器,您可以枚举您要查找的所有 Picasso 变体:

PREFIX dc: <http://purl.org/dc/elements/1.1/>
SELECT *
WHERE {
         values ?creator { "Picasso, Pablo" "Pablo Picasso" } .
         ?objectInfo dc:title ?title .
         ?objectInfo dc:creator ?creator
    }

bif:contains 在此端点上工作并且速度非常快:

PREFIX dc: <http://purl.org/dc/elements/1.1/>
SELECT *
WHERE {
     ?objectInfo dc:title ?title .
     ?objectInfo dc:creator ?creator .
     ?creator bif:contains 'Picasso'
     #FILTER regex(?creator, 'Picasso')
}