2013-03-17 76 views
1

我想在SPARQL中查詢查找各州和大多數本科生在各州的大學。如何編寫一個在SPARQL中返回最大值的查詢?

我嘗試這樣做:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX dbpr: <http://dbpedia.org/resource/> 
PREFIX dbpo: <http://dbpedia.org/ontology/> 
PREFIX dbpprop: <http://dbpedia.org/property/> 
PREFIX dbpedia: <http://dbpedia.org/resource/> 
SELECT ?University ?State (MAX(?nu) AS ?size) 
    WHERE{ 
     ?University dbpo:numberOfUndergraduateStudents ?nu. 
     ?University a dbpo:University. 
     ?University dbpo:state ?State. 
     { 
     SELECT ?State 
      WHERE{ 
       ?State a dbpo:PopulatedPlace. 
       ?State a dbpo:AdministrativeRegion. 
       ?State dbpo:country dbpedia:United_States. 
       ?State dbpo:capital ?Capital. 
       FILTER(bound(?Capital)) 
      } 
     } 
    } 

但是,它不會返回我的預期的輸出。它會從一個州返回多個學校。 任何人都可以指導我嗎?

回答

5

您不需要內部SELECT(它可以放在外部塊中)。

FILTER(bound(?Capital)) 

- ?資本必須被綁定。

然後,你需要

GROUP BY ?State 

將這個在內部選擇和使用外一個發現與大小實際univerity(-ies)狀態。

您所查詢的是技術上非法目前:

SELECT ?University ?State (MAX(?nu) AS ?size) 

沒有GROUP BY是錯誤的。您只能選擇GROUP BY變量和聚集

+0

感謝您的答案。我做了你所提到的,但我仍然不止一次地在各州讀大學。這意味着它不會使每個州都有最大規模的大學。 你知道問題出在哪裏嗎? – Sina 2013-03-18 01:17:49

+2

[SPARQL 1.1 spec,§11.2](http://www.w3.org/TR/sparql11-query/#groupby)包含:「如果在SELECT,HAVING或ORDER BY的查詢級別中使用聚合,但GROUP BY術語不被使用,那麼這被認爲是一個隱含的組合,所有的解決方案都屬於這個組合。「因此,儘管給定的查詢沒有回答原始問題,但它似乎是合法的。 (爲什麼DBpedia會返回多個答案,我不明白。) – 2013-03-19 17:12:38

2

由於AndyS說:的順序,在這裏做的事情是

  1. 查找每個州的本科生的數量最大,
  2. 查找大學或擁有這一數量的本科生的大學。

第一步進入子查詢,第二步進入外部查詢。 那麼你得到這個:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX dbpr: <http://dbpedia.org/resource/> 
PREFIX dbpo: <http://dbpedia.org/ontology/> 
PREFIX dbpprop: <http://dbpedia.org/property/> 
PREFIX dbpedia: <http://dbpedia.org/resource/> 
SELECT ?University ?State ?size 
WHERE{ 
    ?University dbpo:numberOfUndergraduateStudents ?size. 
    ?University a dbpo:University. 
    ?University dbpo:state ?State. 
    { 
    SELECT ?State (MAX(?nu) as ?size) 
     WHERE{ 
      ?State a dbpo:PopulatedPlace. 
      ?State a dbpo:AdministrativeRegion. 
      ?State dbpo:country dbpedia:United_States. 
      ?State dbpo:capital ?Capital. 
      ?University dbpo:numberOfUndergraduateStudents ?nu. 
      ?University a dbpo:University. 
      ?University dbpo:state ?State. 
      FILTER(bound(?Capital)) 
     } 
     GROUP BY ?State 
    } 
} 
相關問題