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 для литералов или нет.

Другие вопросы по тегам