使用SPARQL查询DBPedia以查找具有相同对象的主题

时间:2017-06-11 21:26:00

标签: sparql rdf semantic-web dbpedia

我正在尝试从dbpedia中找到所有这些资源,例如rdf:具有相同对象的人,例如出生日期。 我想用子查询来做这件事,但绝对不是解决方案。 任何人都可以提供一些有用的指针吗?

4 个答案:

答案 0 :(得分:1)

根据你的描述,我认为你的意思是:

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
}

调整类型和谓词以适应。

这将包括一些冗余:你会找到主题相同的答案('拿破仑''拿破仑')并获得两次答案('Daniel Dennett''Neil Kinnock','Neil Kinnock''Daniel Dennett') 。您可以使用过滤器删除它:

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)
}

See the result

答案 1 :(得分:0)

SPARQL查询基本上是一组三重模式,即表单查询的连接(逻辑AND)

?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>}
}
} 

答案 2 :(得分:0)

其他人的替代解决方案是使用此查询模板中的聚合函数

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))

答案 3 :(得分:0)

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不允许您在其公共端点上执行该查询,因为它会占用更多的时间,并you cannot change that time。然而,there are ways to execute it