SPARQL 按类别获取 dbpedia 资源
SPARQL get dbpedia ressources by category
我是 SPARQL 的初学者。我在 DBpedia 上按城市获取所有大学的纬度和经度时遇到问题。
我试了很多东西都没有成功。
This 页面在 dbo:campus
属性 上显示了巴黎的大学,所以我想用这个 属性 获取大学列表,然后获取地理坐标。
PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>
PREFIX dbo: <http://dbpedia.org/ontology/>
SELECT ?name, ?univ, ?lat, ?long WHERE {
?p rdf:type dbo:Place.
?p rdfs:label ?name.
?p dbo:campus ?u.
?u geo:lat ?lat.
?u geo:long ?long.
?u rdfs:label ?univ
FILTER(LANG(?name) = "en").
FILTER(?name = "Paris")
}
我检查了这个 post DBpedia SPARQL Query US Universities 但它不适用于其他国家/地区。
如果您在渲染的 DBpedia 页面上读到“is SOME_PROPERTY
of”,这意味着相反的方向,即它以倒置的形式显示三元组。因此,您必须反转 SPARQL 查询中的三元组模式。对于您的示例,这意味着大学是主体,巴黎是客体:
?u dbo:campus ?p
标签是DBpedia中的语言标签;因此,FILTER(?name = "Paris")
是不够的。添加英语语言标签有帮助:
FILTER(?name = "Paris"@en)
一个有效的查询是
PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>
PREFIX dbo: <http://dbpedia.org/ontology/>
SELECT ?name, ?univ WHERE {
?p rdf:type dbo:Place.
?p rdfs:label ?name.
?u dbo:campus ?p.
?u geo:lat ?lat.
?u geo:long ?long.
?u rdfs:label ?univ
FILTER(LANG(?name) = "en").
FILTER(?name = "Paris"@en)
}
一些评论:
- 使用标签匹配资源可能会导致不需要的结果。资源由 URI 标识;因此,尽可能使用 URI。
VALUES
子句是 SPARQL 1.1 支持内联数据的一个很酷的特性。
- 如果 使用 URI,则可以省略
rdf:type
三元组模式,因为您不必过滤给定标签的特定类型的资源。
- 官方 SPARQL 标准不允许在投影变量之间使用逗号;这是 Virtuoso 特定的语法。
- SPARQL 支持更紧凑的 Turtle 语法。
- A
FILTER
不需要最后的 .
。
- 尝试使用
LANGMATCHES
来匹配文字中的语言。
“更好”的查询可以是:
PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX dbr: <http://dbpedia.org/resource/>
SELECT ?name ?univ ?lat ?long
WHERE
{ VALUES ?p { dbo:Paris }
?p rdfs:label ?name .
?u dbo:campus ?p ;
geo:lat ?lat ;
geo:long ?long ;
rdfs:label ?univ
FILTER langMatches(lang(?name), "en")
}
我是 SPARQL 的初学者。我在 DBpedia 上按城市获取所有大学的纬度和经度时遇到问题。
我试了很多东西都没有成功。
This 页面在 dbo:campus
属性 上显示了巴黎的大学,所以我想用这个 属性 获取大学列表,然后获取地理坐标。
PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>
PREFIX dbo: <http://dbpedia.org/ontology/>
SELECT ?name, ?univ, ?lat, ?long WHERE {
?p rdf:type dbo:Place.
?p rdfs:label ?name.
?p dbo:campus ?u.
?u geo:lat ?lat.
?u geo:long ?long.
?u rdfs:label ?univ
FILTER(LANG(?name) = "en").
FILTER(?name = "Paris")
}
我检查了这个 post DBpedia SPARQL Query US Universities 但它不适用于其他国家/地区。
如果您在渲染的 DBpedia 页面上读到“is
SOME_PROPERTY
of”,这意味着相反的方向,即它以倒置的形式显示三元组。因此,您必须反转 SPARQL 查询中的三元组模式。对于您的示例,这意味着大学是主体,巴黎是客体:?u dbo:campus ?p
标签是DBpedia中的语言标签;因此,
FILTER(?name = "Paris")
是不够的。添加英语语言标签有帮助:FILTER(?name = "Paris"@en)
一个有效的查询是
PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>
PREFIX dbo: <http://dbpedia.org/ontology/>
SELECT ?name, ?univ WHERE {
?p rdf:type dbo:Place.
?p rdfs:label ?name.
?u dbo:campus ?p.
?u geo:lat ?lat.
?u geo:long ?long.
?u rdfs:label ?univ
FILTER(LANG(?name) = "en").
FILTER(?name = "Paris"@en)
}
一些评论:
- 使用标签匹配资源可能会导致不需要的结果。资源由 URI 标识;因此,尽可能使用 URI。
VALUES
子句是 SPARQL 1.1 支持内联数据的一个很酷的特性。 - 如果 使用 URI,则可以省略
rdf:type
三元组模式,因为您不必过滤给定标签的特定类型的资源。 - 官方 SPARQL 标准不允许在投影变量之间使用逗号;这是 Virtuoso 特定的语法。
- SPARQL 支持更紧凑的 Turtle 语法。
- A
FILTER
不需要最后的.
。 - 尝试使用
LANGMATCHES
来匹配文字中的语言。
“更好”的查询可以是:
PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX dbr: <http://dbpedia.org/resource/>
SELECT ?name ?univ ?lat ?long
WHERE
{ VALUES ?p { dbo:Paris }
?p rdfs:label ?name .
?u dbo:campus ?p ;
geo:lat ?lat ;
geo:long ?long ;
rdfs:label ?univ
FILTER langMatches(lang(?name), "en")
}