Как получить все компании из DBPedia?

Я новичок в поиске DBPedia. Как я могу получить все компании из http://dbpedia.org/sparql?

Этот запрос возвращает только 50 000 организаций:

SELECT DISTINCT * WHERE {?company a dbpedia-owl:Company}

Ответы

Ответ 1

Вы правы, что ваш запрос не возвращает все компании. Однако шаблон правильный. Обратите внимание, что этот запрос, который учитывает только компании, возвращает 88054:

prefix dbpedia-owl: <http://dbpedia.org/ontology/>

select (count(distinct ?company) as ?count)
where {
  ?company a dbpedia-owl:Company
}

Результаты SPARQL

Я думаю, что это ограничение, налагаемое конечной точкой DBpedia SPARQL по соображениям производительности. Одна вещь, которую вы могли бы сделать, это загрузить данные и выполнить запрос локально, но это, вероятно, немного больше работы, чем вы хотите. Вместо этого вы можете заказать результаты (на самом деле не имеет значения, как, если вы всегда это делаете одинаково) и используйте limit и offset для выбора в этих результатах. Например:

prefix dbpedia-owl: <http://dbpedia.org/ontology/>

select ?company
where {
  ?company a dbpedia-owl:Company
}
order by ?company
limit 10

Результаты SPARQL

prefix dbpedia-owl: <http://dbpedia.org/ontology/>

select ?company
where {
  ?company a dbpedia-owl:Company
}
order by ?company
limit 10
offset 5823

Результаты SPARQL

Это общий подход. Однако он по-прежнему имеет проблемы с DBpedia из-за жесткого ограничения на 40000 результатов. Там есть документация, в которой упоминается следующее:

Работа с ограничениями DBpedia Конечная точка SPARQL MaxSortedTopRows Ограничения через LIMIT & OFFSET

Конечная точка DBpedia SPARQL настроена со следующей установкой INI:

MaxSortedTopRows = 40000

Приведенная выше установка устанавливает пороговое значение для отсортированных строк.

Предлагаемое решение этой статьи заключается в использовании подзапросов:

Чтобы предотвратить описанную выше проблему, вы можете использовать использование подзапросов, которые лучше используют временное хранилище, связанное с этим заданием. Пример примет форму:

SELECT ?p ?s 
WHERE 
  {
    {
      SELECT DISTINCT ?p ?s 
      FROM <http://dbpedia.org> 
      WHERE   
        { 
          ?s ?p <http://dbpedia.org/resource/Germany> 
        } ORDER BY ASC(?p) 
    }
  } 
OFFSET 50000 
LIMIT 1000

Я не совсем уверен, почему это решает проблему, возможно, это то, что конечная точка может сортировать более 40000 строк, если она не должна возвращать их все. Во всяком случае, он действительно работает. Ваш запрос станет следующим:

prefix dbpedia-owl: <http://dbpedia.org/ontology/>

select ?company {{
  select ?company { 
    ?company a dbpedia-owl:Company
  }
  order by ?company
}} 
offset 88000
LIMIT 1000

Ответ 2

Еще один способ получить все компании из DBpedia - просто запустить с RDFSlice следующий запрос:

SELECT * 
WHERE {
{?s a <http://dbpedia.org/ontology/Person>.?s ?p ?o.} 
UNION
{?s1 a <http://dbpedia.org/ontology/Person>.?o1 ?p1 ?s1.}
}

Это имеет дополнительное преимущество, предлагая вам все троицы. Он занимает от нескольких минут до нескольких часов в зависимости от вашей оперативной памяти и мощности процессора.