SPARQL - Return 主题列表的相互对象

SPARQL - Return mutual objects of a list of subjects

如何在不了解这些主题的 predicates/objects 的情况下获得所有谓词 + 对象,它们由主题列表共享?
让我们看看维基数据中的这个示例查询:

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

Link to this query.

此查询return所有德国前总理。
现在我想 return 每个谓词 + 对象,每个大臣都有共同之处 例如每个对象都是人类的实例,出生在德国等等。
我想这很容易。但是我不知道。

SPARQL 和 RDF 的一个有趣的方面是您不需要了解有关数据的任何信息就可以查询它。对于您的情况,我建议添加三重模式 ?chancellor ?p ?o . 和 select ?p?o。您可以从那里选择您要查找的任何 属性。如果某些 ?chancellor 匹配项没有 属性 值,请务必使用 OPTIONAL

这个不错。这是一个近乎命中:

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

这需要所有总理,以及他们的财产和价值观。它计算每个 prop/val.

的总理人数

通过排序,您可以在顶部看到最常见的 prop / vals。

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

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.

我认为这符合您的要求。不是很漂亮,我承认。