Репозиторий, созданный с помощью RepositoryManager, не ведет себя так же, как репозиторий, созданный с помощью рабочей среды

Я создаю кунжутное хранилище Java, используя следующий код:

Создайте собственный магазин Java:

  // create a configuration for the SAIL stack
  boolean persist = true;
  String indexes = "spoc,posc,cspo";
  SailImplConfig backendConfig = new NativeStoreConfig(indexes);
  // stack an inferencer config on top of our backend-config
  backendConfig = new ForwardChainingRDFSInferencerConfig(backendConfig);
  // create a configuration for the repository implementation
  RepositoryImplConfig repositoryTypeSpec = new SailRepositoryConfig(backendConfig);
  RepositoryConfig repConfig = new RepositoryConfig(repositoryId, repositoryTypeSpec);
  repConfig.setTitle(repositoryId);
  manager.addRepositoryConfig(repConfig);
  Repository repository = manager.getRepository(repositoryId);

создать хранилище в памяти:

  // create a configuration for the SAIL stack
  boolean persist = true;
  SailImplConfig backendConfig = new MemoryStoreConfig(persist);
  // stack an inferencer config on top of our backend-config
  backendConfig = new ForwardChainingRDFSInferencerConfig(backendConfig);
  // create a configuration for the repository implementation
  RepositoryImplConfig repositoryTypeSpec = new SailRepositoryConfig(backendConfig);
  RepositoryConfig repConfig = new RepositoryConfig(repositoryId, repositoryTypeSpec);
  repConfig.setTitle(repositoryId);
  manager.addRepositoryConfig(repConfig);
  Repository repository = manager.getRepository(repositoryId);

Когда я сохраняю данные в этом репо и выполняю запрос обратно, результаты не совпадают с результатами, возвращаемыми из репозитория, созданного с использованием рабочей среды. Я получаю дубликаты / несколько записей в моем наборе результатов.

Такое же поведение для хранилища в памяти.

Я также заметил, что мои тройки принадлежат пустому контексту, чего нет в репозитории, созданном через верстак.

Что не так с моим кодом выше?

1 ответ

Решение

Насколько я понимаю, в вашем коде нет ничего плохого. Если хранилище, созданное из Workbench, ведет себя по-разному, это, скорее всего, означает, что оно настроено с другим стеком SAIL.

Наиболее вероятным кандидатом на разницу является этот бит:

// stack an inferencer config on top of our backend-config
backendConfig = new ForwardChainingRDFSInferencerConfig(backendConfig);

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

Если вы считаете это проблемой, вы можете исправить это двумя способами. Одним из них является (конечно) просто не создавать свой репозиторий с аргументом сверху. Другой - отключить рассуждения для конкретных запросов. В Workbench вы можете сделать это, сняв флажок "Включить выводимые операторы" на экране запроса. Программно, вы можете сделать это с помощью Query.setIncludeInferred(false) на ваш подготовленный объект запроса. Смотрите Javadoc для деталей.

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