Запрос DBPedia с использованием SPARQL для поиска тем с одинаковыми объектами

Я пытаюсь найти все эти ресурсы из dbpedia, например, для человека типа rdf:type, который имеет тот же объект, например, дату рождения.? Я думал сделать это с помощью подзапроса, но это определенно не решение. Может ли кто-нибудь предоставить какой-нибудь полезный указатель?


person user765160    schedule 11.06.2017    source источник
comment
Как должен выглядеть результат? Для каждой даты рождения всех лиц? Или birthdate, person1, person2? Покажите запрос SPARQL, который вы пробовали до сих пор.   -  person UninformedUser    schedule 12.06.2017
comment
Результат будет примерно таким: человек 1, человек 2, дата рождения. abc bcd 12/12/2001 wer erw 14/10/2001   -  person user765160    schedule 12.06.2017


Ответы (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)
}

Посмотреть результат

person user205512    schedule 12.06.2017
comment
Спасибо пользователю 205512 за ценный вклад. - person user765160; 12.06.2017

Запрос 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>}
}
} 
person Median Hilal    schedule 11.06.2017
comment
Одес это действительно ответ на вопрос? Если бы было больше ожидаемых запросов, которые приводят к 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))
person UninformedUser    schedule 12.06.2017

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 не позволит вам выполнить этот запрос на своей общедоступной конечной точке, потому что он требует больше времени, чем разрешено, и вы не можете изменить это время. Тем не менее, есть способы его выполнить

person William Kinaan    schedule 12.06.2017