SPARQL查询大学

时间:2012-10-28 13:39:25

标签: sparql

我正在尝试使用SPARQL获取大学的名称:

rdf数据如下(还有更多,但这无关紧要)。

<Organization rdf:about="http://data.semanticweb.org/organization/the-university-of-queensland">
    <rdfs:label>The University of Queensland</rdfs:label>
    <homepage rdf:resource="http://www.uq.edu.au/"/>
    <member rdf:resource="http://data.semanticweb.org/person/jane-hunter"/>
    <member rdf:resource="http://data.semanticweb.org/person/kwok-cheung"/>
    <member rdf:resource="http://data.semanticweb.org/person/robert-m-colomb"/>
    <name>The University of Queensland</name>
</Organization>

我编写了一个查询数据的java程序。 我查询数据的字符串如下:

            queryString += "PREFIX swrc:        <http://swrc.ontoware.org/ontology#> \n";
            queryString += "PREFIX dc:          <http://purl.org/dc/elements/1.1/> \n";
            queryString += "PREFIX foaf:        <http://xmlns.com/foaf/0.1/> \n";
            queryString += "PREFIX geo:         <http://www.w3.org/2003/01/geo/wgs84_pos#> \n";
            queryString += "PREFIX ical:        <http://www.w3.org/2002/12/cal/ical#> \n";
            queryString += "PREFIX rdf:         <http://www.w3.org/1999/02/22-rdf-syntax-ns#> \n";
            queryString += "PREFIX rdfs:        <http://www.w3.org/2000/01/rdf-schema#> \n";
            queryString += "PREFIX swc:         <http://data.semanticweb.org/ns/swc/ontology#> \n";
            queryString += "PREFIX swrc_ext:    <http://www.cs.vu.nl/~mcaklein/onto/swrc_ext/2005/05#> \n";
            queryString += "SELECT ?name WHERE {\n";
            queryString += "?university rdfs:label ?aff . \n ?university foaf:name ?name FILTER(str(?aff)='uni') }";

不幸的是,这是不正确的,因为没有返回结果:

<?xml version='1.0' encoding='UTF-8'?> 
  <sparql xmlns='w3.org/2005/sparql-results#'> 
    <head> 
     <variable name='name'/> 
    </head> 
    <results> 
    </results> 
  </sparql>

有人能指出我正确的方向吗?

P.S。如果可能的话,我只想获取10个大学名称。

2 个答案:

答案 0 :(得分:7)

我知道你假设所有大学的名字都有字符串"uni"

请注意,您正在使用字符串"uni"检查值是否相等。您的数据集中确实没有这样的实例。

FILTER(str(?aff)='uni')替换FILTER regex(?aff, "uni", "i")将允许您匹配包含字符串"uni“的值。它是一个带有三个参数的正则表达式过滤器。

  1. 变量
  2. 符合here
  3. 所述语法的正则表达式
  4. 一组可选标志,在这种情况下,我使用了一个标志"i"。这意味着匹配必须不区分大小写。
  5. 为了限制结果数量,您只需使用LIMIT关键字附加查询即可。

    生成的查询应为:

    PREFIX swrc:        <http://swrc.ontoware.org/ontology#>
    PREFIX dc:          <http://purl.org/dc/elements/1.1/>
    PREFIX foaf:        <http://xmlns.com/foaf/0.1/>
    PREFIX geo:         <http://www.w3.org/2003/01/geo/wgs84_pos#>
    PREFIX ical:        <http://www.w3.org/2002/12/cal/ical#>
    PREFIX rdf:         <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
    PREFIX rdfs:        <http://www.w3.org/2000/01/rdf-schema#>
    PREFIX swc:         <http://data.semanticweb.org/ns/swc/ontology#>
    PREFIX swrc_ext:    <http://www.cs.vu.nl/~mcaklein/onto/swrc_ext/2005/05#>
    SELECT ?name WHERE {
        ?university rdfs:label ?aff . 
        ?university foaf:name ?name 
        FILTER regex(?aff, "uni", "i")
    } LIMIT 10;
    

答案 1 :(得分:-1)

在您的RDF代码段中没有“foaf:”命名空间。所以,也许你应该放入你的RDF。除非它当然是RDF文档中的默认命名空间。