SPARQL常用查询

查看查询结果戳DBPedia sparql endpoint
PREFIX定义如下:

PREFIX prop: <http://dbpedia.org/property/>
PREFIX ont: <http://dbpedia.org/ontology/>
PREFIX res: <http://dbpedia.org/resource/>

查询所有谓词

SELECT DISTINCT ?p
WHERE {
    ?s ?p ?o. #WHERE中只有一句条件的时候.可省略
}

一个类似的需求是查询所有属性

SELECT COUNT DISTINCT ?prop 
WHERE {
  ?prop a rdf:Property #a是rdf:type的简写
}
ORDER BY ?prop #可选,只是为了展示ORDER BY的语法

查询一个类的所有子类

select ?p { #WHERE在sparql中可省略
    ?p rdfs:subClassOf* ont:Person . #加*表示此步操作需要迭代进行,不仅查找Person的子类还查找子类的子类;去掉*则只查找Person的子类
}

类似的查询一个类的所有超类

select ?p {
    ont:Actor rdfs:subClassOf* ?p .
}

类似的语法还可以用于查询一个属性的子属性

select ?p { 
    ?p rdfs:subPropoertyOf* prop:height . 
}

列出一个类的所有属性

select distinct ?property where { 
   ?property rdfs:domain ont:Actor.
}

子查询(列出所有有生卒年份记载的声优的相关事实)

SELECT DISTINCT ?birth ?death ?actor ?p ?o 
WHERE{
  ?actor ?p ?o.
  {
    SELECT DISTINCT ?actor ?birth ?death
    WHERE {
      ?actor rdf:type ont:VoiceActor .
      ?actor prop:birthDate ?birth.
      ?actor prop:deathDate ?death. 
    } 
  }
}

使用FILTER正则匹配

SELECT DISTINCT ?p
WHERE {
  ?p a rdf:Property.
  ?s ?p ?o.
  FILTER (REGEX(str(?p), "date", "i"))  # "i"代表大小写不敏感,匹配?p中出现date
}

显示所有的named graph

SELECT DISTINCT ?g {
GRAPH ?g {}
}

MINUS只显示一些有用的predicate

select *
{
  {
    term: ?p ?o.
    MINUS {term: owl:sameAs ?o}
    MINUS {term: rdf:type ?o}
    MINUS {term: rdfs:label ?o}
    MINUS {term: rdfs:comment ?o}
    MINUS {term: ont:abstract ?o}
    MINUS {term: dct:subject ?o}
  }
  UNION
  {
    ?s ?p term:
    MINUS {?s ont:wikiPageRedirects term:}
  }
}

聚合语句的写法(显示配偶信息大于1条的演员)

SELECT ?s, (COUNT(?s) AS ?cnt)
{
?s a ont:Actor.
?s prop:spouse ?o.
FILTER(isLiteral(?o))
}
GROUP BY ?s
HAVING (COUNT(?s) > 1)

使用VALUES关键词一次给一个变量赋多个值(返回wikidata对应的dbpedia实体的信息)

PREFIX wd: <http://www.wikidata.org/entity/>
select DISTINCT * { 
  VALUES ?x {wd:Q309486 wd:Q4653 wd:Q76}
  ?s owl:sameAs ?x .     
  ?s ?p ?o .
  FILTER(STRSTARTS(STR(?p), "http://dbpedia.org/") )
}

推荐阅读更多精彩内容