Я пытался создать новый репозиторий на удаленном сервере GraphDB с помощью RDF4J, но у меня возникли проблемы.
Это работает, но, похоже, неверно
HTTPRepositoryConfig implConfig = new HTTPRepositoryConfig(address);
RepositoryConfig repoConfig = new RepositoryConfig("test", "test", implConfig);
Model m = new
Однако, судя по информации, которую я получаю из «репозитория редактирования» в рабочей среде, результат не выглядит правильным. Все значения пусты, кроме id и title.
Это не удается
Я попытался скопировать настройки из существующего репозитория, который я создал на верстаке, но это не удалось:
org.eclipse.rdf4j.repository.config.RepositoryConfigException:
Unsupported repository type: owlim:MonitorRepository
Код для этой попытки основан на найденном здесь. За исключением того, что файл конфигурации основан на существующем репо, как описано выше. Я также попытался настроить файл, представленный в примере, но это тоже не удалось:
org.eclipse.rdf4j.repository.config.RepositoryConfigException:
Unsupported Sail type: graphdb:FreeSail
У кого-нибудь есть советы?
ОБНОВИТЬ Как правильно отметила Генриетта Хармс, я должен был предоставить свой код, а не просто связать с ним. Таким образом, я мог бы обнаружить, что в конце концов я не сделал полную копию, а изменил первые важные части, на которые она указывает в своем ответе. Полный код ниже:
String address = "serveradr";
RemoteRepositoryManager repositoryManager = new RemoteRepositoryManager( address);
repositoryManager.initialize();
// Instantiate a repository graph model
TreeModel graph = new TreeModel();
InputStream config = Rdf4jHelper.class.getResourceAsStream("/repoconf2.ttl");
RDFParser rdfParser = Rio.createParser(RDFFormat.TURTLE);
rdfParser.setRDFHandler(new StatementCollector(graph));
rdfParser.parse(config, RepositoryConfigSchema.NAMESPACE);
config.close();
// Retrieve the repository node as a resource
Resource repositoryNode = graph.filter(null, RDF.TYPE, RepositoryConfigSchema.REPOSITORY).subjects().iterator().next();
// Create a repository configuration object and add it to the repositoryManager
RepositoryConfig repositoryConfig = RepositoryConfig.create(graph, repositoryNode);
Не работает на последней строке.
ОТВЕТИЛИ @HenrietteHarmse дает правильный метод в своем ответе ниже. Ошибка вызвана отсутствием зависимостей. Вместо прямого использования RDF4J мне следовало использовать среду выполнения, свободную от графа.
Здесь есть ряд проблем:
(1) RepositoryManager repositoryManager = new LocalRepositoryManager(new File("."));
создаст репозиторий, из которого когда-либо запускается ваше Java-приложение.
(2) Переход на new LocalRepositoryManager(new File("$GraphDBInstall/data/repositories"))
приведет к тому, что репозиторий будет создан под управлением GraphDB (при условии, что у вас есть локальный экземпляр GraphDB), только если GraphDB не запущен. Если вы запустите GraphDB после запуска вашей программы, вы сможете увидеть репозиторий в рабочей среде GraphDB.
(3) Что вам нужно сделать, так это получить диспетчер репозитория удаленного GraphDB, что можно сделать с помощью RepositoryManager repositoryManager = RepositoryProvider.getRepositoryManager("http://IPAddressOfGraphDB:7200");
.
(4) Таким образом, как вы указали конфигурацию, вы вызываете потерю конфигурации графа RDF. Правильный способ указать это:
RepositoryConfig repositoryConfig = RepositoryConfig.create(graph, repositoryNode);
repositoryManager.addRepositoryConfig(repositoryConfig);
(5) Незначительная проблема заключается в том, что GraphUtil.getUniqueSubject(...)
устарел, для чего вы можете использовать что-то вроде следующего:
Model model = graph.filter(null, RDF.TYPE, RepositoryConfigSchema.REPOSITORY);
Iterator<Statement> iterator = model.iterator();
if (!iterator.hasNext())
throw new RuntimeException("Oops, no <http://www.openrdf.org/config/repository#> subject found!");
Statement statement = iterator.next();
Resource repositoryNode = statement.getSubject();
РЕДАКТИРОВАТЬ на 20180408:
(5) Или вы можете использовать компактный вариант, как @JeenBroekstra предложил в комментариях:
Models.subject(
graph.filter(null, RDF.TYPE, RepositoryConfigSchema.REPOSITORY))
.orElseThrow(() -> new RuntimeException("Oops, no <http://www.openrdf.org/config/repository#> subject found!"));
РЕДАКТИРОВАТЬ на 20180409:
Для удобства я добавил полный пример кода здесь.
РЕДАКТИРОВАТЬ на 20180410:
Таким образом, фактическим виновником оказался неправильный pom.xml
. Правильная версия приведена ниже:
<dependency>
<groupId>com.ontotext.graphdb</groupId>
<artifactId>graphdb-free-runtime</artifactId>
<version>8.4.1</version>
</dependency>
Пункт 5 может быть выполнен в одной строке кода, возможно, немного проще: Resource repositoryNode = Models.subject(graph.filter(null, RDF.TYPE, RepositoryConfigSchema.REPOSITORY)).orElseThrow(() -> new RuntimeException("Oops, no <http://www.openrdf.org/config/repository#> subject found!"));
Я обновил вопрос, включив в него фактический код, который я использую. Это делает ваши пункты 1,2 и 3 решенными. Я использую другой код в 4, но использование вашей строки также приводит к сбою. Я сохранил свой неразвитый и не готовый к производству способ получения темы ресурса.
Это будет либо проблема с вашим файлом repoconfig2.ttl
, либо с вашим pom.xml
.
@SeymoureFrye Для удобства я добавил рабочую полную конфигурацию и пример кода.
@HenrietteHarmse Большое спасибо за помощь мне с этим. Мне не удалось заставить ваш пример работать, он не работает так же, как и мой код: при попытке создать RepositoryConfig с предоставленным вами файлом. Ваш файл дал другую, но похожую ошибку: «Неподдерживаемый тип репозитория: graphdb: FreeSailRepository». Мне удалось сделать то, что я хотел, используя API отдыха GraphDB, используя JSON и PUT вместо ttl и RDF4J. Чтобы узнать, вызвал ли ошибку мой сервер, я переместил ваш код так, чтобы создание RepositoryConfig происходило до того, как были упомянуты какие-либо серверы. Но ошибка все еще была.
Какую версию GraphDB вы используете? На какую версию указывает pom.xml
?
Я использовал org.eclipse.rdf4j / rdf4j-runtime-2.2-4. И это было виновником, как вы и подозревали. Я снова запустил вашу программу с правильным POM, и она сработала. Еще раз спасибо! Я должен был проверить ваш POM, а не только ваш код. Кстати, мне не удалось найти упоминания о среде выполнения graphdb-free в документации GraphDB. Я также не нашел загружаемых примеров с файлом POM. В документации упоминается только RDF4J и ссылки на javadoc для последней версии. Если кто-то из Ontotext прочитает это, подумайте о том, чтобы упростить поиск этой информации.
@SeymoureFrye Я рад, что мы смогли выяснить настоящего виновника!
Я считаю, что у меня была такая же проблема. Я использовал пример кода из GraphDB Free для работы с RDF4J в качестве удаленной службы и столкнулся с тем же исключением, что и вы (неподдерживаемый тип Sail: graphdb: FreeSail). Ответ Генриетты Хармсе напрямую не касается этой проблемы, но следует следовать приведенным там предложениям, чтобы избежать проблем позже. Кроме того, если посмотреть на код RDF4J, вам понадобится следующая зависимость в вашем файле pom.xml
(при условии, что GraphDB 8.5):
<dependency>
<groupId>com.ontotext.graphdb</groupId>
<artifactId>graphdb-free-runtime</artifactId>
<version>8.5.0</version>
</dependency>
Похоже, это связано с тем, что с META-INF происходит какая-то загрузка службы, с которой я, честно говоря, не знаком. Может быть, кто-то может предоставить более подробную информацию в комментариях. Требование о добавлении этой зависимости также, похоже, отсутствует в инструкциях, поэтому, если это сработает для вас, дайте мне знать. Другие, выполнившие те же шаги, что и мы, также смогут решить эту проблему.
Я снова запустил приведенный мной пример кода GraphDB 8.4.1 и 8.5.0 без каких-либо проблем. Не желаете поделиться полным обзором проблемы?
Ваш код отлично работает с указанным вами pom.xml
. Однако, если вы используете зависимость от rdf4j-runtime вместо graphdb-free-runtime, вы получите исключение org.eclipse.rdf4j.repository.config.RepositoryConfigExceptio n для «Неподдерживаемый тип репозитория: graphdb: FreeSailRepository». Ограничение количества символов не позволяет мне полностью перечислить трассировку стека.
Хорошо, это имеет смысл. Я подозревал что-то подобное, но, имея частичную информацию, трудно угадать, чего не хватает. Следовательно, почему я попросил pom.xml
.
@HenrietteHarmse, так как я не могу ответить на ваш ответ, сделаю это здесь: когда вы скопировали мой ответ в свое обновление, вы использовали неправильный номер версии. Последняя версия - 8.5.0.
Добавьте полный пример кода и файлы pom.xml. Код по предоставленной вами ссылке может измениться, что ограничит пользу от вашего вопроса для других пользователей SO.