2012-03-29 14 views
4

私はJenaを使ってオントロジに格納されたデータを照会しています。オブジェクトの一部は文字列で識別されますが、スキャンしたドキュメントを処理しているときにOCRエラーが発生する可能性があるため、まったく同じ文字列を使用できないことがあります。したがって、私は最も類似した文字列を探したいと思います。この目的のためにSPARQLを使用する方法はありますか?どういうわけかSPARQLでlevenshtein距離を計算できますか?SPARQL:類似した文字列を見つける方法?

これができない場合、私はまだJavaでlevenshtein距離を計算できます。しかし、効率的なアルゴリズムでは、SPARQLを使用して無関係の文字列をフィルタリングする必要があります。

答えて

6

SPARQLはこれを直接行うことはできませんが、levenshtein distance関数をjavaで実装し、それをSPARQL FILTER句で使用できます。 Extensions in ARQには拡張機能の使用に関する詳細があります。

+0

似たような解決策がゴマにありますか? – Gaurav

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だが、ソースを見つけることができません。

関連する問題