SPARQL:如何找到类似的字符串?

时间:2012-03-29 01:46:12

标签: java sparql jena levenshtein-distance similarity

我正在使用Jena来查询存储在本体中的数据。一些对象由字符串标识,但有时完全相同的字符串不可用,因为我正在处理扫描的文档,因此可能存在OCR错误。因此,我想找到最相似的字符串。有没有办法将SPARQL用于此目的?我可以以某种方式计算SPARQL中的levenshtein距离吗?

如果无法做到这一点,我仍然可以计算java中的levenshtein距离。但是,有效的算法仍然需要使用SPARQL过滤掉不相关的字符串。

3 个答案:

答案 0 :(得分:6)

SPARQL不能直接执行此操作,但您可以在java中实现levenshtein distance函数,并在SPARQL FILTER子句中使用它。 Extensions in ARQ详细介绍了如何使用扩展功能。

答案 1 :(得分:4)

如果有人感兴趣,我就是这样实现的:

public class LevenshteinFilter extends FunctionBase2 
{  
     public NodeValue exec(NodeValue value1, NodeValue value2){
         int i = StringUtils.getLevenshteinDistance(value1.asString(), value2.asString()); 
         return NodeValue.makeInteger(i); 
     }
}

用法:

 String functionUri = "http://www.example.org/LevenshteinFunction"; 
 FunctionRegistry.get().put(functionUri , LevenshteinFilter.class); 
 String s = "...";
 String sparql = "SELECT ?x WHERE { ?x a Something . " +
                                   "?x hasString ?str . " + 
                                   "FILTER(<"+functionUri +">(?str, \"" + s + "\") < 5) }";
 QueryExecution qexec = QueryExecutionFactory.create(sparql, model); 
 ResultSet rs = qexec.execSelect(); 
 while(rs.hasNext()){
     ...
 }

答案 2 :(得分:0)

芝麻有fr/sparna/rdf/sesame/toolkit/functions/LevenshteinDistanceFunction但找不到来源。