SPARQL - 返回主题列表中的相互对象

时间:2017-02-27 00:19:21

标签: sparql rdf wikidata

如何在不知道这些主题的谓词/对象的情况下获取由主题列表共享的所有谓词+对象? 让我们看一下维基数据中的这个示例查询:

SELECT ?chancellor WHERE{
    ?chancellor wdt:P39 wd:Q4970706. #P39 = position held, Q4970706 = Chancellor of Germany
}

Link to this query.

此查询返回德国所有前任总理 现在我想返回每个谓词+对象,每个大臣都有共同点,例如每个主题都是人的一个实例,出生于德国等等 我想这很简单。但是我不知道。

2 个答案:

答案 0 :(得分:5)

这是一个很好的。这里有一个接近命中:

prefix wdt: <http://www.wikidata.org/prop/direct/>
prefix wd: <http://www.wikidata.org/entity/>

select ?p ?o (count(distinct ?chancellor) as ?cs) where {
    ?chancellor wdt:P39 wd:Q4970706.  
    ?chancellor ?p ?o .
}
group by ?p ?o
order by desc(?cs)

Link to query

这需要所有大臣,以及他们的属性和价值观。它计算每个道具/瓦尔的总理数。

通过命令,您可以在顶部看到最常见的道具。

现在你想要的是所有大臣的唯一结果。我们可以很容易地在一个查询中获得大臣的数量,并将两者结合在一起:

prefix wdt: <http://www.wikidata.org/prop/direct/>
prefix wd: <http://www.wikidata.org/entity/>

select ?p ?o where {
   {
       # Find number of chancellors 
       select (count(?chancellor) as ?num_chancellors) where { 
           ?chancellor wdt:P39 wd:Q4970706
       }
   }
   {
       # Find number of chancellors per predicate / value
       select ?p ?o (count(distinct ?chancellor) as ?chancellor_count) where {
           ?chancellor wdt:P39 wd:Q4970706.  
           ?chancellor ?p ?o .
       }
       group by ?p ?o 
   }
   # Choose results all chancellors share 
   filter (?num_chancellors = ?chancellor_count)
}

Link to query

我认为这可以满足您的需求。我承认,不是很漂亮。

答案 1 :(得分:0)

SPARQL和RDF的一个有趣的方面是您无需了解要查询的数据。在您的情况下,我建议添加三重模式?chancellor ?p ?o .并选择?p?o。从那里您可以选择您正在寻找的任何房产。如果某些OPTIONAL匹配项没有该属性值,请务必使用?chancellor