我正在使用Jena來查詢存儲在本體中的數據。有些對象由字符串標識,但是有時候完全相同的字符串不可用,因爲我正在處理掃描的文檔,因此可能會出現OCR錯誤。因此,我想找到最相似的字符串。有沒有辦法使用SPARQL來達到這個目的?我能以某種方式計算SPARQL中的levenshtein距離嗎?SPARQL:如何找到類似的字符串?
如果這是不可能的,我仍然可以計算java中的levenshtein距離。但是,一個有效的算法仍然需要使用SPARQL過濾不相關的字符串。
我正在使用Jena來查詢存儲在本體中的數據。有些對象由字符串標識,但是有時候完全相同的字符串不可用,因爲我正在處理掃描的文檔,因此可能會出現OCR錯誤。因此,我想找到最相似的字符串。有沒有辦法使用SPARQL來達到這個目的?我能以某種方式計算SPARQL中的levenshtein距離嗎?SPARQL:如何找到類似的字符串?
如果這是不可能的,我仍然可以計算java中的levenshtein距離。但是,一個有效的算法仍然需要使用SPARQL過濾不相關的字符串。
SPARQL無法直接執行此操作,但可以在java中實現levenshtein距離函數,並將其用於SPARQL FILTER子句中。 Extensions in 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
卻找不到源頭。
芝麻中有沒有類似的解決方案? – Gaurav 2014-07-18 10:58:17