如何在dbpedia中过滤消除歧义的名称

时间:2013-01-23 21:24:17

标签: rdf sparql dbpedia

我正在尝试使用以下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'))
}

1 个答案:

答案 0 :(得分: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:Placedbpedia-owl:PopulatedPlace s和dbpedia-owl:Settlement s(同时)的资源。罗纳全都是三个 如果您需要dbpedia-owl:Placedbpedia-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'))
  }
}