Я пытаюсь найти все эти ресурсы из dbpedia, например, для человека типа rdf:type, который имеет тот же объект, например, дату рождения.? Я думал сделать это с помощью подзапроса, но это определенно не решение. Может ли кто-нибудь предоставить какой-нибудь полезный указатель?
Запрос DBPedia с использованием SPARQL для поиска тем с одинаковыми объектами
Ответы (4)
Из того, что вы описываете, я думаю, вы имеете в виду:
prefix dbp: <http://dbpedia.org/property/>
prefix foaf: <http://xmlns.com/foaf/0.1/>
select ?s1 ?s2 ?dob
where {
?s1 a foaf:Person ; dbp:birthDate ?dob . # Find a person, get their dob
?s2 a foaf:Person ; dbp:birthDate ?dob . # Find a person with the same dob
}
Настройте тип и предикат в соответствии с требованиями.
Это будет включать в себя некоторую избыточность: вы найдете ответы с одинаковыми темами («Наполеон», «Наполеон») и получите ответы дважды («Дэниел Деннет», «Нил Киннок», «Нил Киннок», «Дэниел Деннет»). Вы можете удалить это с помощью фильтра:
filter (?s1 < ?s2)
что просто гарантирует, что одно идет раньше другого (однако обработчик запросов хочет это сделать).
prefix dbp: <http://dbpedia.org/property/>
prefix foaf: <http://xmlns.com/foaf/0.1/>
select ?s1 ?s2 ?dob
where {
?s1 a foaf:Person ; dbp:birthDate ?dob .
?s2 a foaf:Person ; dbp:birthDate ?dob .
filter (?s1 < ?s2)
}
Запрос SPARQL в основном представляет собой набор тройных шаблонов, то есть объединение (логическое И) запросов формы
?subject ?predicate ?object.
То, что вам нужно, идентично ?object
. Учитывая, что вас интересует только ?subject
(?predicate
не имеет значения), вы можете выполнить такой запрос, упорядочив результаты в зависимости от ?object
. Таким образом, вы увидите результаты, разделенные ?object
вместе.
select ?s ?p ?o where {
?s ?p ?o.
}
order by ?o
Если вы также заботитесь о ?predicate
, вы должны упорядочить результат, используя его вторым.
select ?s ?p ?o where {
?s ?p ?o.
}
order by ?o ?p
Поскольку эта пара запросов может включать слишком много результатов, поскольку они будут извлекать все возможные результаты. Я рекомендую фильтровать ?object
в зависимости от определенных критериев. Например, чтобы выбрать всех ?subject
, совместно использующих экземпляр Person
, в качестве своего ?object
, используйте:
select ?s where {
?s ?p ?o.
{select ?o where{
?o a <http://dbpedia.org/ontology/Person>}
}
}
object, subject1, subject2
или даже object, subject_1, ..., subject_n
- person UninformedUser; 12.06.2017
Альтернативным решением для других является использование агрегатных функций, как в этом шаблоне запроса.
select ?o (count(distinct ?s) as ?cnt) (group_concat(distinct ?s; separator=";") as ?subjects) {
?s a <CLASS> ;
<PREDICATE> ?o .
}
group by ?o
order by desc(count(distinct ?s))
который возвращает для каждого объекта количество субъектов и список предметов, принадлежащих классу CLASS
для данного предиката PREDICATE
Например, запросив даты футболистов, можно использовать
prefix dbo: <http://dbpedia.org/ontology/>
select ?date (count(distinct ?s) as ?cnt) (group_concat(distinct ?s; separator=";") as ?subjects) {
?s a dbo:SoccerPlayer ;
dbo:birthDate ?date .
}
group by ?date
order by desc(count(distinct ?s))
select * where {
?person1 a <http://dbpedia.org/ontology/Person>.
?person1 dbo:birthYear ?date.
?person2 a <http://dbpedia.org/ontology/Person>.
?person2 dbo:birthYear ?date
FILTER (?person1 != ?person2)
}
limit 10
Dbpedia не позволит вам выполнить этот запрос на своей общедоступной конечной точке, потому что он требует больше времени, чем разрешено, и вы не можете изменить это время. Тем не менее, есть способы его выполнить
birthdate, person1, person2
? Покажите запрос SPARQL, который вы пробовали до сих пор. - person UninformedUser   schedule 12.06.2017