【问题标题】:SPARQL: how to find similar strings?SPARQL:如何找到相似的字符串?
【发布时间】:2012-04-12 16:03:41
【问题描述】:
我正在使用 Jena 来查询存储在本体中的数据。一些对象由字符串标识,但有时完全相同的字符串不可用,因为我正在处理扫描的文档,因此可能存在 OCR 错误。因此,我想找到最相似的字符串。有没有办法为此目的使用 SPARQL?我可以在 SPARQL 中以某种方式计算 levenshtein 距离吗?
如果这是不可能的,我仍然可以在 java 中计算 levenshtein 距离。然而,一个有效的算法仍然需要使用 SPARQL 过滤掉不相关的字符串。
【问题讨论】:
标签:
java
sparql
jena
levenshtein-distance
similarity
【解决方案1】:
SPARQL 不能直接执行此操作,但您可以在 java 中实现 levenshtein distance 函数,并在 SPARQL FILTER 子句中使用它。 Extensions in ARQ 有关于使用扩展函数的详细信息。
【解决方案2】:
如果有人感兴趣,这就是我的实现方式:
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()){
...
}
【解决方案3】:
芝麻有fr/sparna/rdf/sesame/toolkit/functions/LevenshteinDistanceFunction,但找不到来源。