我正在使用Jena来查询存储在本体中的数据。一些对象由字符串标识,但有时完全相同的字符串不可用,因为我正在处理扫描的文档,因此可能存在OCR错误。因此,我想找到最相似的字符串。有没有办法将SPARQL用于此目的?我可以以某种方式计算SPARQL中的levenshtein距离吗?
如果无法做到这一点,我仍然可以计算java中的levenshtein距离。但是,有效的算法仍然需要使用SPARQL过滤掉不相关的字符串。
答案 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
但找不到来源。