2012-03-29 15 views
4

Ich benutze Jena, um in einer Ontologie gespeicherte Daten abzufragen. Einige der Objekte sind durch eine Zeichenkette gekennzeichnet, aber manchmal ist die exakt gleiche Zeichenkette nicht verfügbar, da ich gescannte Dokumente verarbeite und OCR-Fehler auftreten können. Daher würde ich gerne die ähnlichsten Strings finden. Gibt es eine Möglichkeit, SPARQL für diesen Zweck zu verwenden? Kann ich die Levenshtein-Distanz in SPARQL irgendwie berechnen?SPARQL: Wie findet man ähnliche Strings?

Wenn das nicht möglich ist, kann ich noch die Levenshtein Entfernung in Java berechnen. Ein effizienter Algorithmus würde jedoch immer noch das Ausfiltern irrelevanter Strings mit SPARQL erfordern.

Antwort

6

SPARQL kann dies nicht direkt tun, aber Sie könnten die Levenshtein-Distanzfunktion in Java implementieren und sie in einer SPARQL FILTER-Klausel verwenden. Extensions in ARQ enthält Details zur Verwendung von Erweiterungsfunktionen.

+0

Gibt es eine ähnliche Lösung in Sesam? – Gaurav

4

Falls jemand interessiert, das ist, wie ich es umgesetzt:

public class LevenshteinFilter extends FunctionBase2 
{ 
    public NodeValue exec(NodeValue value1, NodeValue value2){ 
     int i = StringUtils.getLevenshteinDistance(value1.asString(), value2.asString()); 
     return NodeValue.makeInteger(i); 
    } 
} 

Nutzung:

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

Für Sesam ist es fr/sparna/rdf/sesame/toolkit/functions/LevenshteinDistanceFunction aber die Quelle nicht finden kann.

Verwandte Themen