1

我正在尝试使用以下 SPARQL 查询来查找法国的 Rhône 部门。

SELECT * WHERE {
  ?x rdfs:label "Rhone"@en.
  ?x rdf:type dbpedia-owl:Place.
  ?x dbpedia-owl:abstract ?abstract.
  FILTER (LANGMATCHES(LANG(?abstract), 'en'))
}

这是 DBPEDIA 资源:http ://dbpedia.org/page/Rh%C3%B4ne_(department )

问题是它一直在寻找罗纳河,而不是部门(或州)。如果我将 rdf:type 更改为 PopulatedPlace 或 Settlement,那么搜索将找不到任何内容。

我可以使用“*”或“吗?” 扩大搜索字符串的字符,例如:

'* 罗纳河 *'

如:

SELECT * WHERE {
  ?x rdfs:label "*Rhone*"@en.
  ?x rdf:type dbpedia-owl:Settlement.
  ?x dbpedia-owl:abstract ?abstract.
  FILTER (LANGMATCHES(LANG(?abstract), 'en'))
}

其次,我认为在一个查询中使用多个过滤器是可以的,例如:

SELECT * WHERE {
  ?x rdfs:label "Rhone"@en.
  ?x rdf:type dbpedia-owl:Place.
  ?x rdf:type dbpedia-owl:PopulatedPlace.
  ?x rdf:type dbpedia-owl:Settlement.
  ?x dbpedia-owl:abstract ?abstract.
  FILTER (LANGMATCHES(LANG(?abstract), 'en'))
}
4

1 回答 1

4

是的,您可以使用通配符创建搜索字符串 - 有点。您可以FILTER使用字符串匹配正则表达式FILTER (regex(?label, "Rhone"))该正则表达式将字符串与内容中任何位置的字符串“Rhone”匹配。这FILTER会使查询执行速度变慢。

但是,这不会返回您想要的资源,因为该部门的标签是“Rhône”。

任何字符的通配符都是.(句点)。因此,如果您不确定“Rhône”的拼写并希望它出现在标签中的任何位置,您可以使用

SELECT * WHERE {
  ?x rdf:type dbpedia-owl:Place.
  ?x dbpedia-owl:abstract ?abstract.
  ?x rdfs:label ?label.
  FILTER (regex(?label, "Rh.ne") && LANGMATCHES(LANG(?abstract), 'en'))
}

由于正则表达式,完成此查询确实需要很长时间。我刚试过这个查询,它超时了。

第三个查询有效,但只会匹配dbpedia-owl:Places 和dbpedia-owl:PopulatedPlaces 和dbpedia-owl:Settlements 的资源(同时)。罗讷河谷是三者。
如果您想要dbpedia-owl:Placeordbpedia-owl:PopulatedPlacedbpedia-owl:Settlement,请使用:

SELECT DISTINCT * WHERE {
  {
  ?x rdf:type dbpedia-owl:Place.
  ?x rdfs:label ?label.
  ?x dbpedia-owl:abstract ?abstract.
  FILTER (regex(?label, "Rhône") && LANGMATCHES(LANG(?abstract), 'en'))
  } UNION {
  ?x rdf:type dbpedia-owl:Settlement.
  ?x rdfs:label ?label.
  ?x dbpedia-owl:abstract ?abstract.
  FILTER (regex(?label, "Rhône") && LANGMATCHES(LANG(?abstract), 'en'))
  } UNION {
  ?x rdf:type dbpedia-owl:PopulatedPlace.
  ?x rdfs:label ?label.
  ?x dbpedia-owl:abstract ?abstract.
  FILTER (regex(?label, "Rhône") && LANGMATCHES(LANG(?abstract), 'en'))
  }
}
于 2013-01-23T22:34:40.713 回答