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