В настоящее время моя группа разрабатывает интерфейс «укажи и щелкни» для навигации и извлечения информации из графиков RDF. В рамках этого мы подключаемся к различным конечным точкам тройного хранилища, используя метод sparqlservice от Jena. Чтобы переместить точку, на которую в данный момент смотрит пользователь, пользователь может выбрать узел и сделать его центром. Затем программа выбирает соседей этого узла, используя выражение, показанное ниже:
CONSTRUCT {
<URI> ?p ?o .
?s ?p <URI> .
} WHERE {
{<URI> ?p ?o .}
UNION
{?s ?p <URI> .}
} LIMIT N
Где URI — это узел, который выбрал пользователь (мы делаем что-то немного другое для литералов). Затем это выражение выполняется следующим образом:
Query myQuery = QueryFactory.create(_query);
QueryExecution qexe = QueryExecutionFactory.sparqlService(this.myURL, myQuery);
Model resultModel = qexe.execConstruct();
return resultModel;
Проблема, с которой мы сталкиваемся, связана с пустыми узлами. Когда Jena получает пустой узел от конечной точки, ему немедленно присваивается идентификатор Jena bNode. Этот идентификатор не будет совпадать с идентификатором, представленным конечной точкой, и если пользователь выбирает пустой узел на стороне клиента в качестве нового центра, это, очевидно, вызывает проблемы.
Поэтому мой вопрос: есть ли способ сохранить исходный идентификатор конечной точки в Jena? Просматривая внутренности Jena, я вижу, что несколько классов ResultSet
используют класс для обработки сопоставления между идентификаторами конечной точки и Jena, который называется LabelToNodeMap
. Есть ли способ получить это сопоставление? Или, в качестве альтернативы, запретите Jena использовать собственную схему идентификаторов и вместо этого используйте конечные точки.