1

我想在 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))
            }
        }
    }

但是,它没有返回我的预期输出。它从一个州返回不止一所学校。有人可以指导我吗?

4

2 回答 2

5

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

FILTER(bound(?Capital))

-- ?资本必须绑定。

那你需要

GROUP BY ?State

将其放入内部 SELECT 并使用外部 SELECT 查找具有该大小状态的实际大学(-ies)。

您的查询目前在技术上是非法的:

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

没有 GROUP BY 是错误的。您只能选择 GROUP BY 变量和聚合

于 2013-03-17T19:09:32.353 回答
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
    }
}
于 2013-03-19T16:53:18.407 回答