dc: создатель строкового литерала против регулярного выражения FILTER в SPARQL
Я использую Virtuoso SPARQL Endpoint от Europeana.
Я пытался найти в SPARQL информацию о конкретном участнике. Насколько я понимаю, это можно сделать так:
PREFIX dc: <http://purl.org/dc/elements/1.1/>
SELECT ?title
WHERE {
?objectInfo dc:title ?title .
?objectInfo dc:creator 'Picasso' .
}
Тем не менее я ничего не получаю взамен.
Кроме того, я использовал регулярное выражение FILTER для поиска литерала.
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')
}
На самом деле это сработало очень хорошо и вернул правильные результаты.
Мой вопрос: возможно ли создать запрос SPARQL, не используя FILTER для поиска работы конкретного художника?
Большое спасибо.
2 ответа
Я не думаю, что есть какие-либо объекты с "Пикассо" буквально как создатель. Так что фильтр регулярных выражений - хороший выбор, но медленный.
Вот способ найти строки, которые соответствуют вашему регулярному выражению:
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')
}
Если вы не хотите использовать фильтр регулярных выражений, вы можете перечислить все варианты Пикассо, которые вы ищете:
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: содержит работы на этой конечной точке и довольно быстро:
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')
}
1) Ваш первый запрос имеет не связанные тройные шаблоны.
2) Я предполагаю и согласно описанию лексики, dc:creator
ожидает ресурс, то есть URI. Использование 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 для литералов или нет.