Возможно, самый простой способ сделать это - с помощью запроса 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 намного проще.