2017-02-27 28 views
1

如何獲取所有謂詞+對象,這些主題由主題列表共享 - 不知道這些主題的謂詞/對象的任何內容?
讓我們看看來自維基數據這個例子查詢:SPARQL - 返回主題列表的相互對象

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

Link to this query.

該查詢返回德國的所有前任校長。
現在我想要返回每個謂語+對象,每個大臣有共同點例如每個科目都是人類的一個實例,出生在德國等等。
我想這是一個簡單的。但我不知道。

回答

4

這是一個很好的。這裏有一個近命中:

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

我認爲這是做你想做的。我不是很漂亮,我承認。

+0

很好的答案!方法#1也很有趣! #2正是我想要的。 – rinderwahn

+0

查詢結果並不令人遺憾: - /通過使用group_concat而不是在第一個例子中計數,您可以看到哪些校友共享prop/vals,這是一個有用的變體。 – user205512

0

SPARQL和RDF的一個有趣的方面是,你不需要知道任何有關數據的查詢。在你的情況下,我會建議添加三重模式?chancellor ?p ?o .並選擇?p?o。從那裏你可以選擇你正在尋找的任何財產。如果某些?chancellor匹配沒有該屬性值,請務必使用OPTIONAL

+1

他希望得到所有與大臣有共同點的謂詞+對象元組,我不認爲你回答了這個問題。 – AKSW

+0

就像@AKSW說的,這不是我要找的。 – rinderwahn