如何编写一个返回SPARQL中最大值的查询?

Sin*_*ina 1 database semantic-web 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))
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

但是,它不会返回我的预期输出.它从一个州返回一所以上的学校.任何人都可以指导我吗?

And*_*dyS 5

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

FILTER(bound(?Capital))
Run Code Online (Sandbox Code Playgroud)

- ?资本必须受到约束.

那你需要

GROUP BY ?State
Run Code Online (Sandbox Code Playgroud)

把它放在一个内部的SELECT中,并使用外部的SELECT来查找具有该大小状态的实际大小(-ies).

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

SELECT ?University ?State (MAX(?nu) AS ?size)
Run Code Online (Sandbox Code Playgroud)

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

  • [SPARQL 1.1规范,§11.2](http://www.w3.org/TR/sparql11-query/#groupby)包含:"如果在SELECT,HAVING或ORDER BY中的查询级别使用聚合,但GROUP BY如果不使用术语,则将其视为一个隐含的组,所有解决方案都属于该组." 因此,虽然给定的查询不回答原始问题,但它似乎是合法的.(为什么DBpedia会返回多个答案,我不明白.) (2认同)