2016-01-16 6 views
1

Предполагая (s, p, o) и список, я хотел бы использовать структуру модели в Sesame и проверить, можно ли использовать объект s, список предикатов и достичь o в конце. Например, мы говорим, что существует путь, если для (s, p, o) и {p1, p2, p3} существуют следующие тройки: (s, p1, o1), (o1, p2, o2), (o2, p3, o)Охватить один и тот же объект с помощью набора предикатов в Sesame

Есть ли какая-либо возможность в кунжуте или структуре модели?

ответ

1

Возможно, самый простой способ сделать это - с помощью запроса SPARQL.

Запрос будет использовать выражение пути свойства, чтобы выразить этот путь. Поскольку вы хотите знать, существует ли путь для заданной начальной и конечной точек, я предполагаю, что ответ «да» или «нет» достаточно хорош. Таким образом, мы можем сделать логическое ASK запрос:

ASK WHERE { :s (:p1|:p2|:p3)+ :o . } 

Это вернет true если путь любой длины существует между :s и :o, который состоит из некоторой комбинации свойств :p1, :p2 и :p3.

Поскольку вы не можете выполнить запрос SPARQL непосредственно на Model, вам нужно будет создать в памяти Repository и добавить Model к нему, прежде чем делать запрос, например, так:

Model model = ...; // your model 

// create and initialize a temporary in-memory store 
Repository rep = new SailRepository(new MemoryStore()); 
rep.initialize(); 

try (RepositoryConnection conn = rep.getConnection()) { 
    // load the model into the repository 
    conn.add(model); 

    // execute the query 
    String query = "ASK WHERE { :s (:p1|:p2|:p3)+ :o . }"; 
    boolean pathExists = conn.prepareBooleanQuery(query).evaluate(); 
} 

В качестве альтернативы , вы можете реализовать обход пути самостоятельно с помощью простого рекурсивного метода.

Model model = ...; // your model 

IRI start = ... ; // your start point :s 
IRI end = ...; // your end point :o . 
IRI p1 = ...; 
IRI p2 = ...; 
IRI p3 = ... ; 

boolean pathExists = pathExists(model, start, end, p1, p2, p3); 

с реальным способом нечто вроде этого:

boolean pathExists(Model m, IRI start, IRI end, IRI... properties) { 
    for(IRI p: properties) { 
     Model fromStart = m.filter(start, p, null); 
     if (fromStart.contains(start, p, end)) { 
       return true; 
     } 
     else { 
      for (Value obj: fromStart.objects()) { 
       if (obj instanceof Resource) { 
        if(pathExists(m, obj, end, properties)) { 
          return true; 
        }    
       } 
      } 
     } 
    } 
    return false; 
}  

... Вы, возможно, потребуется расширить, что немного (со списком посещенных промежуточных узлов, чтобы избежать бесконечных циклов), но это иллюстрирует основной принцип, на который я надеюсь. В любом случае использование запроса SPARQL намного проще.

 Смежные вопросы

  • Нет связанных вопросов^_^