Исключить результаты из запроса DBpedia SPARQL на основе префикса URI
как я могу исключить группу понятий при использовании конечная точка DBpedia SPARQL? Я использую следующий базовый запрос, чтобы получить список понятий:
SELECT DISTINCT ?concept
WHERE {
?x a ?concept
}
LIMIT 100
это дает мне список из 100 понятий. Я хочу исключить все понятия, которые попадают в класс/группу YAGO (т. е., чей IRIs начинается с http://dbpedia.org/class/yago/
). Я могу отфильтровать отдельные понятия, как это:
SELECT DISTINCT ?concept
WHERE {
?x a ?concept
FILTER (?concept != <http://dbpedia.org/class/yago/1950sScienceFictionFilms>)
}
LIMIT 100
но я не могу понять, как исключить все подклассы 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
1 ответов
это может показаться немного неудобным, но ваш комментарий о приведении к строке и выполнении некоторых строковых проверок, вероятно, находится на правильном пути. Вы можете сделать это немного более эффективно, используя функцию SPARQL 1.1 strstarts
:
SELECT DISTINCT ?concept
WHERE {
?x a ?concept
FILTER ( !strstarts(str(?concept), "http://dbpedia.org/class/yago/") )
}
LIMIT 100
другой альтернативой было бы найти класс Yago верхнего уровня и исключить те понятия, которые rdfs:subClassOf
этот класс верхнего уровня. Это, вероятно, было бы лучшим решением в долгосрочный (поскольку он не требует приведения к строкам, и он основан на структуре графика). К сожалению, это не похоже на там is один класс Яго верхнего уровня, сопоставимый с 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> |
----------------------------------------------------------------
учитывая, что концепции яго не являются такой же структурированный, как и некоторые другие, похоже, что струнный подход может быть лучшим в этом случае. Однако, если вы хотите, вы можете сделать запрос без строки, подобный этому, который запрашивает 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
Я не уверен, что в конечном итоге быстрее. Для первого требуется преобразование в string, а для strstarts
, если выполняются в наивная мода, должна потреблять http://dbpedia.org/class/
в каждой концепции перед чем-то есть несоответствие. Второй требует девяти сравнений, которые, если IRIs интернированы, являются просто проверками идентичности объектов. Это интересный вопрос для дальнейшего расследования.