如果您想直接关系到一个人的人,那么你需要两个三模式,一个具有人作为主体,另一个作为对象。下面是构建这样一个查询的一种方法:
SELECT DISTINCT ?has ?of ?person
WHERE {
{?person a foaf:Person;
?of dbr:Chuck_Norris}
UNION
{?person a foaf:Person.
dbr:Chuck_Norris ?has ?person}
}
我使用dbr:
,因为这是在DBpedia中预定义前缀。
在某些情况下,你如果在http://live.dbpedia.org/sparql
查询现在得到不同的结果,此查询有一个限制。它只会让你与其他DBpedia资源有关系。通常可能有相关人士称为文字。我不知道有一个很好的方法来获取它们,但一种方法是要求提供已知用于人际关系的属性列表。这里是一个值的列表dbp:spouse
一个例子:
SELECT DISTINCT ?has ?of ?person
WHERE {
{?person a foaf:Person;
?of dbr:Chuck_Norris}
UNION
{?person a foaf:Person.
dbr:Chuck_Norris ?has ?person}
UNION
{values ?has {dbp:spouse}
dbr:Chuck_Norris ?has ?person .}
}
从http://live.dbpedia.org/sparql这将额外为您带来:
has | person
---------------------------------------------------------
http://dbpedia.org/property/spouse | "Dianne Holechek"@en
http://dbpedia.org/property/spouse | "Gena O'Kelley"@en
---------------------------------------------------------
一般要求这样的文字会给你带来很多垃圾结果,你可以使用字符串过滤器来减少它。
见RDF和SPARQL教程,了解这些数据是由三元组和查询是通过三重模式来完成。我的意思是,你的查询选择了一些'?P',但它没有用在WHERE部分。 – AKSW