Исключить результаты из запроса DBpedia SPARQL на основе префикса URI

116
7

Как я могу исключить группу понятий при использовании конечной точки DBpedia SPARQL? Я использую следующий базовый запрос, чтобы получить список понятий:


SELECT DISTINCT ?concept
WHERE {
?x a ?concept
}
LIMIT 100

Результаты SPARQL


Это дает мне список из 100 понятий. Я хочу исключить все концепции, входящие в класс/группу YAGO (то есть, IRI которых начинаются с http://dbpedia.org/class/yago/). Я могу отфильтровать отдельные концепции следующим образом:


SELECT DISTINCT ?concept
WHERE {
?x a ?concept
FILTER (?concept != <http://dbpedia.org/class/yago/1950sScienceFictionFilms>)
}
LIMIT 100

Результаты SPARQL


Но я не могу понять, как исключить все подклассы YAGO из моих результатов? Я попытался использовать *, как это, но ничего не получилось:


FILTER (?concept != <http://dbpedia.org/class/yago/*>)

Обновление:


Этот запрос с regex, кажется, делает трюк, но он действительно, очень медленный и уродливый. Я действительно с нетерпением жду лучшей альтернативы.


SELECT DISTINCT ?type WHERE {
[] a ?type
FILTER( regex(str(?type), "^(?!http://dbpedia.org/class/yago/).+"))
}
ORDER BY ASC(?type)
LIMIT 10

спросил(а) 2021-01-25T16:31:46+03:00 4 месяца, 4 недели назад
1
Решение
139

Это может показаться немного неудобным, но ваш комментарий о кастинге на строку и выполнение строковых проверок, вероятно, на правильном пути. Вы можете сделать это немного более эффективно, используя функцию SPARQL 1.1 strstarts:


SELECT DISTINCT ?concept
WHERE {
?x a ?concept
FILTER ( !strstarts(str(?concept), "http://dbpedia.org/class/yago/") )
}
LIMIT 100

Результаты SPARQL


Другой альтернативой было бы найти класс YAGO верхнего уровня и исключить те понятия, которые rdfs:subClassOf относятся к классу верхнего уровня. Вероятно, это было бы лучшим решением в долгосрочной перспективе (так как оно не требует кастинга для строк и основывается на структуре графика). К сожалению, не похоже, что существует один класс YAGO верхнего уровня, сравнимый с owl:Thing. Я просто загрузил иерархию типов YAGO с страницы загрузки DBpedia и запускал этот запрос, который запрашивает классы без суперклассов, против него:


prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>

select distinct ?root where {
[] rdfs:subClassOf ?root
filter not exists { ?root rdfs:subClassOf ?superRoot }
}


и я получил эти девять результатов:

----------------------------------------------------------------
| root |
================================================================
| <http://dbpedia.org/class/yago/YagoLegalActorGeo> |
| <http://dbpedia.org/class/yago/WaterNymph109550125> |
| <http://dbpedia.org/class/yago/PhysicalEntity100001930> |
| <http://dbpedia.org/class/yago/Abstraction100002137> |
| <http://dbpedia.org/class/yago/YagoIdentifier> |
| <http://dbpedia.org/class/yago/YagoLiteral> |
| <http://dbpedia.org/class/yago/YagoPermanentlyLocatedEntity> |
| <http://dbpedia.org/class/yago/Thing104424418> |
| <http://dbpedia.org/class/yago/Dryad109551040> |
----------------------------------------------------------------

Учитывая, что концепции YAGO не так структурированы, как некоторые из других, похоже, что подход на основе строк может быть лучшим в этом случае. Однако, если вы этого захотите, вы можете сделать такой запрос без строкового запроса, который задает 100 понятий, за исключением тех, которые имеют один из этих девяти результатов в качестве суперкласса:


select distinct ?concept where {
[] a ?concept .
filter not exists {
?concept rdfs:subClassOf* ?super .
values ?super {
yago:YagoLegalActorGeo
yago:WaterNymph109550125
yago:PhysicalEntity100001930
yago:Abstraction100002137
yago:YagoIdentifier
yago:YagoLiteral
yago:YagoPermanentlyLocatedEntity
yago:Thing104424418
yago:Dryad109551040
}
}
}
limit 100

Результаты SPARQL


Я не уверен, что закончится быстрее. Первое требует преобразования в строку, а strstarts, если оно реализовано наивным образом, должно потреблять http://dbpedia.org/class/ в каждой концепции до того, как что-то будет несоответствием. Второй требует девяти сравнений, которые, если IRI являются интернированными, являются просто проверками идентификации объекта. Это интересный вопрос для дальнейшего изучения.

ответил(а) 2021-01-25T16:31:46+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема