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

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

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

результаты SPARQL

это дает мне список из 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

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

1 ответов


это может показаться немного неудобным, но ваш комментарий о приведении к строке и выполнении некоторых строковых проверок, вероятно, находится на правильном пути. Вы можете сделать это немного более эффективно, используя функцию 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 этот класс верхнего уровня. Это, вероятно, было бы лучшим решением в долгосрочный (поскольку он не требует приведения к строкам, и он основан на структуре графика). К сожалению, это не похоже на там 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

результаты SPARQL

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