Создайте репозиторий на удаленном сервере с помощью RDF4J

Я пытался создать новый репозиторий на удаленном сервере 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 мне следовало использовать среду выполнения, свободную от графа.

Добавьте полный пример кода и файлы pom.xml. Код по предоставленной вами ссылке может измениться, что ограничит пользу от вашего вопроса для других пользователей SO.

Henriette Harmse 07.04.2018 11:01
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
686
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Здесь есть ряд проблем:

(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!"));

Jeen Broekstra 08.04.2018 02:53

Я обновил вопрос, включив в него фактический код, который я использую. Это делает ваши пункты 1,2 и 3 решенными. Я использую другой код в 4, но использование вашей строки также приводит к сбою. Я сохранил свой неразвитый и не готовый к производству способ получения темы ресурса.

Seymoure Frye 09.04.2018 05:07

Это будет либо проблема с вашим файлом repoconfig2.ttl, либо с вашим pom.xml.

Henriette Harmse 09.04.2018 07:51

@SeymoureFrye Для удобства я добавил рабочую полную конфигурацию и пример кода.

Henriette Harmse 09.04.2018 11:22

@HenrietteHarmse Большое спасибо за помощь мне с этим. Мне не удалось заставить ваш пример работать, он не работает так же, как и мой код: при попытке создать RepositoryConfig с предоставленным вами файлом. Ваш файл дал другую, но похожую ошибку: «Неподдерживаемый тип репозитория: graphdb: FreeSailRepository». Мне удалось сделать то, что я хотел, используя API отдыха GraphDB, используя JSON и PUT вместо ttl и RDF4J. Чтобы узнать, вызвал ли ошибку мой сервер, я переместил ваш код так, чтобы создание RepositoryConfig происходило до того, как были упомянуты какие-либо серверы. Но ошибка все еще была.

Seymoure Frye 09.04.2018 13:45

Какую версию GraphDB вы используете? На какую версию указывает pom.xml?

Henriette Harmse 09.04.2018 13:50

Я использовал org.eclipse.rdf4j / rdf4j-runtime-2.2-4. И это было виновником, как вы и подозревали. Я снова запустил вашу программу с правильным POM, и она сработала. Еще раз спасибо! Я должен был проверить ваш POM, а не только ваш код. Кстати, мне не удалось найти упоминания о среде выполнения graphdb-free в документации GraphDB. Я также не нашел загружаемых примеров с файлом POM. В документации упоминается только RDF4J и ссылки на javadoc для последней версии. Если кто-то из Ontotext прочитает это, подумайте о том, чтобы упростить поиск этой информации.

Seymoure Frye 10.04.2018 14:46

@SeymoureFrye Я рад, что мы смогли выяснить настоящего виновника!

Henriette Harmse 10.04.2018 15:38

Я считаю, что у меня была такая же проблема. Я использовал пример кода из 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 без каких-либо проблем. Не желаете поделиться полным обзором проблемы?

Henriette Harmse 10.04.2018 12:08

Ваш код отлично работает с указанным вами pom.xml. Однако, если вы используете зависимость от rdf4j-runtime вместо graphdb-free-runtime, вы получите исключение org.eclipse.rdf4j.repository.config.RepositoryConfigExceptio‌ n для «Неподдерживаемый тип репозитория: graphdb: FreeSailRepository». Ограничение количества символов не позволяет мне полностью перечислить трассировку стека.

dnleng 10.04.2018 13:46

Хорошо, это имеет смысл. Я подозревал что-то подобное, но, имея частичную информацию, трудно угадать, чего не хватает. Следовательно, почему я попросил pom.xml.

Henriette Harmse 10.04.2018 13:53

@HenrietteHarmse, так как я не могу ответить на ваш ответ, сделаю это здесь: когда вы скопировали мой ответ в свое обновление, вы использовали неправильный номер версии. Последняя версия - 8.5.0.

dnleng 11.04.2018 13:17

Другие вопросы по теме