我正在使用Jena查询存储在本体中的数据。其中一些对象由字符串标识,但是有时候完全相同的字符串不可用,因为我正在处理扫描文档,所以可能存在OCR错误。因此,我想找到最相似的字符串。是否有办法在SPARQL中使用?我是否能够计算出Levenshtein距离来实现这个目的?
如果这不可能,在Java中仍然可以计算Levenshtein距离。然而,一个高效的算法仍需要使用SPARQL过滤掉不相关的字符串。
我正在使用Jena查询存储在本体中的数据。其中一些对象由字符串标识,但是有时候完全相同的字符串不可用,因为我正在处理扫描文档,所以可能存在OCR错误。因此,我想找到最相似的字符串。是否有办法在SPARQL中使用?我是否能够计算出Levenshtein距离来实现这个目的?
如果这不可能,在Java中仍然可以计算Levenshtein距离。然而,一个高效的算法仍需要使用SPARQL过滤掉不相关的字符串。
SPARQL无法直接完成此操作,但您可以在Java中实现Levenshtein距离函数,并在SPARQL FILTER子句中使用它。关于使用扩展函数的详细信息,请参阅ARQ中的扩展。
如果有人感兴趣,这是我实现它的方法:
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()){
...
}
fr/sparna/rdf/sesame/toolkit/functions/LevenshteinDistanceFunction
,但找不到源代码。