SPARQL: как найти похожие строки? - PullRequest
4 голосов
/ 29 марта 2012

Я использую Jena для запроса данных, хранящихся в онтологии.Некоторые из объектов идентифицируются строкой, однако иногда та же самая строка недоступна, так как я обрабатываю отсканированные документы, и поэтому могут возникать ошибки распознавания.Поэтому я бы хотел найти наиболее похожие строки.Есть ли способ использовать SPARQL для этой цели?Могу ли я как-то рассчитать расстояние Левенштейна в SPARQL?

Если это невозможно, я все равно могу вычислить расстояние Левенштейна в Java.Однако эффективный алгоритм по-прежнему требует отфильтровывать нерелевантные строки с использованием SPARQL.

Ответы [ 3 ]

6 голосов
/ 29 марта 2012

SPARQL не может сделать это напрямую, но вы можете реализовать функцию расстояния Левенштейна в java и использовать ее в предложении SPARQL FILTER. Расширения в ARQ содержит подробности об использовании функций расширений.

4 голосов
/ 14 апреля 2012

На случай, если кому-то интересно, я так и реализовал:

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 голосов
/ 17 марта 2017

Для кунжута fr/sparna/rdf/sesame/toolkit/functions/LevenshteinDistanceFunction, но не могу найти источник.

...