2012-03-29 38 views
4

我正在使用Jena來查詢存儲在本體中的數據。有些對象由字符串標識,但是有時候完全相同的字符串不可用,因爲我正在處理掃描的文檔,因此可能會出現OCR錯誤。因此,我想找到最相似的字符串。有沒有辦法使用SPARQL來達到這個目的?我能以某種方式計算SPARQL中的levenshtein距離嗎?SPARQL:如何找到類似的字符串?

如果這是不可能的,我仍然可以計算java中的levenshtein距離。但是,一個有效的算法仍然需要使用SPARQL過濾不相關的字符串。

回答

6

SPARQL無法直接執行此操作,但可以在java中實現levenshtein距離函數,並將其用於SPARQL FILTER子句中。 Extensions in ARQ有關於使用擴展功能的詳細信息。

+0

芝麻中有沒有類似的解決方案? – Gaurav 2014-07-18 10:58:17

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

芝麻有fr/sparna/rdf/sesame/toolkit/functions/LevenshteinDistanceFunction卻找不到源頭。