SPARQL:如何查找相似字符串?

4

我正在使用Jena查询存储在本体中的数据。其中一些对象由字符串标识,但是有时候完全相同的字符串不可用,因为我正在处理扫描文档,所以可能存在OCR错误。因此,我想找到最相似的字符串。是否有办法在SPARQL中使用?我是否能够计算出Levenshtein距离来实现这个目的?

如果这不可能,在Java中仍然可以计算Levenshtein距离。然而,一个高效的算法仍需要使用SPARQL过滤掉不相关的字符串。

3个回答

6

SPARQL无法直接完成此操作,但您可以在Java中实现Levenshtein距离函数,并在SPARQL FILTER子句中使用它。关于使用扩展函数的详细信息,请参阅ARQ中的扩展


在Sesame中是否有类似的解决方案可用? - Gaurav

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()){
     ...
 }

1
对于芝麻,有fr/sparna/rdf/sesame/toolkit/functions/LevenshteinDistanceFunction,但找不到源代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接