Как указать RDF4J использовать тройки SPIN RDF, когда sp:text присутствует в импортированном файле RDF?

Я использую RDF4J сервер и верстак версии 2.2.2. Я использую репозиторий с поддержкой SPIN в RDF4J, и я читаю RDF-файл, созданный в TobBraid Composer Free Edition (TBC FE), содержащий множество spin:construct правила. TBD FE настроен на включение исходного кода SPARQL для моих конструкторов через sp:text имущество. Я заметил, что когда sp:text Тройка присутствует, что делает исходный код SPARQL доступным для RDF4J, RDF4J, по-видимому, использует источник SPARQL вместо использования RDF-токенового представления того же запроса. Мои первичные и вторичные вопросы:

  • Как я могу указать RDF4J использовать представление RDF конструктора SPIN, когда оба sp:text а представление RDF присутствует в импортированном файле RDF?
  • Если RDF4J использует sp:text представление конструктора SPIN, как он может быть направлен на использование определений префиксов, присутствующих в заголовке импортированного файла RDF? У меня пока 69 конструкторов и я считаю. Хотя я могу встраивать определения префиксов в каждом конструкторе, это кажется расточительным.

Когда я лишаю RDF4J из sp:text Представление исходного кода SPARQL, конструкторы работают, как и ожидалось, с использованием префиксов, определенных в заголовке импортированного файла RDF. Я могу лишить RDF4J исходного кода, выполнив запрос на удаление к исходному коду, прежде чем создать экземпляр класса, для которого я определил конструктор. Я использовал этот запрос на обновление SPARQL для достижения этой цели:

PREFIX sp: <http://spinrdf.org/sp#>
DELETE {?s sp:text ?o .} WHERE {?s sp:text ?o .}

Я хотел бы сохранить исходный код SPARQL для отображения в графическом интерфейсе, который я создаю и который взаимодействует с сервером RDF4J через запросы SPARQL. Мое неудобное временное исправление состоит в замене другого пользовательского свойства данных на sp:text свойство с использованием запроса на обновление SPARQL, использованного в шаге 5 ниже. Подстановка этого свойства успешно не позволяет RDF4J найти исходный код SPARQL для конструкторов SPIN. RDF4J затем интерпретирует вместо этого токенизированное RDF-представление правила. Есть ли более чистый способ заставить RDF4J выполнять конструкторы SPIN из RDF, а не из исходного кода SPARQL? Я думаю, что должен быть какой-то способ дать сигнал RDF4J для интерпретации представления RDF вместо исходного кода SPARQL, но я не знаю как.

А теперь кровавые подробности, чтобы сделать эту ситуацию воспроизводимой...

  1. Создайте репозиторий с поддержкой SPIN в RDF4J, используя рабочую среду RDF4J. Шахта называется TakeRDF4J4SPIN (Хранилища → Новый Хранилище)
  2. Очистить репозиторий с помощью рабочей среды RDF4J (Изменить → Очистить)
  3. Загрузите pub7.rdf, используя инструментальные средства RDF4J... (Изменить → Добавить с использованием базового URI в качестве неконтролируемого идентификатора контекста)

Обратите внимание, что этот файл RDF определяет все соответствующие префиксы в начале файла:

<?xml version="1.0"?>
<rdf:RDF
    xmlns:fn="http://www.w3.org/2005/xpath-functions#"
    xmlns:soo="http://www.disa.mil/dso/a2i/ontologies/PBSM/Sharing/SpectrumOperationsOntology#"
    xmlns:spolicy="http://www.disa.mil/dso/a2i/ontologies/PBSM/Sharing/spolicy#"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:spin="http://spinrdf.org/spin#"
    xmlns:sp="http://spinrdf.org/sp#"
    xmlns:smf="http://topbraid.org/sparqlmotionfunctions#"
    xmlns:owl="http://www.w3.org/2002/07/owl#"
    xmlns:arg="http://spinrdf.org/arg#"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
    xmlns:pub7="http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/Pub7#"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
    xmlns:spl="http://spinrdf.org/spl#"
  xml:base="http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/Pub7">

Также обратите внимание, что конструктор SPIN прикреплен к классу pub7:Pub7TestClass является:

CONSTRUCT {
    ?this spin:hasConstraintViolation _:b0 . 
    _:b0 a spin:ConstraintViolation ;
        rdfs:label "Test message." ;
        spin:violationRoot ?this ;
        spin:violationLevel spin:Error ;
       spolicy:sPActionRecordHasTimestamp ?timestamp .
}
WHERE {
    BIND(now() AS ?timestamp) .
}
  1. Попытка создать экземпляр pub7:Pub7TestClass...

Я использую этот запрос на обновление SPARQL в Модификации рабочего места RDF4J → Обновление SPARQL, чтобы создать экземпляр...

PREFIX inst: <http://www.disa.mil/dso/a2i/ontologies/PBSM/Sharing/Instantiations#>
PREFIX pub7: <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/Pub7#>

INSERT DATA {
  inst:aPub7TestClassInstance_test1 a pub7:Pub7TestClass .
}

Что должно привести к неопределенной ошибке префикса, о которой сообщается в рабочей среде RDF4J из-за попытки выполнить вышеуказанный конструктор на основе sp:text Представление исходного кода SPARQL:

org.eclipse.rdf4j.query.UpdateExecutionException: org.eclipse.rdf4j.repository.RepositoryException: org.eclipse.rdf4j.sail.SailException: org.eclipse.rdf4j.query.MalformedQueryException: org.eclipse.rdf4j.query.parser.sparql.ast.VisitorException: QName 'spin:hasConstraintViolation' uses an undefined prefix
  1. Теперь спрячьте конструкторы SPIN sp:text из RDF4J с использованием следующего запроса на обновление SPARQL:

,

PREFIX sp: <http://spinrdf.org/sp#>
PREFIX soo: <http://www.disa.mil/dso/a2i/ontologies/PBSM/Sharing/SpectrumOperationsOntology#>
DELETE { 
  ?originalPolicyURI sp:systemProperty ?policySourceCodeString . 
  ?originalPolicyURI sp:text ?policySourceCodeString .
} 
INSERT { 
  ?originalPolicyURI soo:policySourceCode ?policySourceCodeString . 
}
WHERE {
  ?originalPolicyURI sp:text ?policySourceCodeString . 
}
  1. Теперь повторно запустите запрос на обновление SPARQL, показанный на шаге 4, чтобы создать экземпляр тестового класса. На этот раз запрос на обновление должен выполняться без ошибок.

  2. Теперь используйте функцию Explore → Explore в RDF4J Workbench, чтобы посмотреть на созданного нами экземпляра / индивидуума, inst:aPub7TestClassInstance_test1, Следует видеть, что экземпляр имеет уведомление о нарушении ограничения через spin:hasConstratintViolation свойство, свидетельствующее о том, что конструктор теста действительно выполнялся на этот раз в отсутствие sp:text представление, вынужденное использовать RDF-токеновое представление конструктора SPIN.

1 ответ

У меня есть частичный, не элегантный обходной путь для решения моего вторичного вопроса о включении префиксов в правила вращения. В качестве шага инициализации я запускаю следующий запрос на обновление SPARQL, который добавляет необходимые префиксы к каждому из sp:text строки. Конечно, этот обходной путь ограничен, так как запрос включает в себя отображения префиксов, которые я использую. Если бы требовались другие префиксы, то запрос ниже необходимо было бы отредактировать, чтобы включить новые определения запроса.

Вот запрос SPARQL Update, который я использую в качестве шага инициализации после того, как мои онтологии определения класса / правила / свойства были загружены в RDF4J, но до того, как я загрузил мои экземпляры, онтология загружена. (Время имеет решающее значение, так как онтология экземпляров начинает вызывать конструкторы SPIN.)

PREFIX sp: <http://spinrdf.org/sp#>

DELETE { 
    ?rule sp:text ?ruleText . 
} 
INSERT { 
    ?rule sp:text ?newRuleText . 
} 
WHERE { 
    ?rule sp:text ?ruleText . 
    BIND (IF (CONTAINS(?ruleText, "fn:"),      "PREFIX fn: <http://www.w3.org/2005/xpath-functions#>\n","") 
        AS ?prefixComponent00) . 
    BIND (IF (CONTAINS(?ruleText, "owl:"),     "PREFIX owl: <http://www.w3.org/2002/07/owl#>\n","")
        AS ?prefixComponent01) . 
    BIND (IF (CONTAINS(?ruleText, "spin:"),    "PREFIX spin: <http://spinrdf.org/spin#>\n","")
        AS ?prefixComponent02) . 
    BIND (IF (CONTAINS(?ruleText, "spl:"),     "PREFIX spl: <http://spinrdf.org/spl#>\n","")
        AS ?prefixComponent03) . 
    BIND (IF (CONTAINS(?ruleText, "sp:"),      "PREFIX sp: <http://spinrdf.org/sp#>\n","")
        AS ?prefixComponent04) . 
    BIND (IF (CONTAINS(?ruleText, "par:"),     "PREFIX par: <http://parliament.semwebcentral.org/parliament#>\n","")
        AS ?prefixComponent05) . 
    BIND (IF (CONTAINS(?ruleText, "rdf:"),     "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n","")
        AS ?prefixComponent06) . 
    BIND (IF (CONTAINS(?ruleText, "rdfs:"),    "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n","")
        AS ?prefixComponent07) . 
    BIND (IF (CONTAINS(?ruleText, "time:"),    "PREFIX time: <http://www.w3.org/2006/time#>\n","")
        AS ?prefixComponent08) . 
    BIND (IF (CONTAINS(?ruleText, "xsd:"),     "PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>\n","")
        AS ?prefixComponent09) . 
    BIND (IF (CONTAINS(?ruleText, "geo:"),     "PREFIX geo: <http://www.opengis.net/ont/geosparql#>\n","")
        AS ?prefixComponent10) . 
    BIND (IF (CONTAINS(?ruleText, "geof:"),    "PREFIX geof: <http://www.opengis.net/def/function/geosparql/>\n:","")
        AS ?prefixComponent11) . 
    BIND (IF (CONTAINS(?ruleText, "inst:"),    "PREFIX inst: <http://www.disa.mil/dso/a2i/ontologies/PBSM/Sharing/Instantiations#>\n","")
        AS ?prefixComponent12) . 
    BIND (IF (CONTAINS(?ruleText, "pub7:"),    "PREFIX pub7: <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/Pub7#>\n","")
        AS ?prefixComponent13) . 
    BIND (IF (CONTAINS(?ruleText, "pub8:"),    "PREFIX pub8: <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/Pub8#>\n","")
        AS ?prefixComponent14) . 
    BIND (IF (CONTAINS(?ruleText, "soo:"),     "PREFIX soo: <http://www.disa.mil/dso/a2i/ontologies/PBSM/Sharing/SpectrumOperationsOntology#>\n","")
        AS ?prefixComponent15) . 
    BIND (IF (CONTAINS(?ruleText, "spolicy:"), "PREFIX spolicy: <http://www.disa.mil/dso/a2i/ontologies/PBSM/Sharing/spolicy#>\n","")
        AS ?prefixComponent16) . 
    BIND (IF (CONTAINS(?ruleText, "sharing:"), "PREFIX sharing: <http://www.disa.mil/dso/a2i/ontologies/PBSM/Sharing/sharing#>\n","")
        AS ?prefixComponent17) . 
    BIND (IF (CONTAINS(?ruleText, "dd1494:"),  "PREFIX dd1494: <http://www.disa.mil/dso/a2i/ontologies/PBSM/Sharing/dd1494#>\n","")
        AS ?prefixComponent18) . 
    BIND (IF (CONTAINS(?ruleText, "Nuvio:"),   "PREFIX Nuvio: <http://cogradio.org/ont/Nuvio.owl#>\n","")
        AS ?prefixComponent19) . 
    BIND (IF (CONTAINS(?ruleText, "CRO2:"),    "PREFIX CRO2: <http://cogradio.org/ont/CRO2.owl#>\n","")
        AS ?prefixComponent20) . 
    BIND (IF (CONTAINS(?ruleText, "olo:"),     "PREFIX olo: <http://purl.org/ontology/olo/core#>\n","")
        AS ?prefixComponent21) . 
    BIND (CONCAT( 
      ?prefixComponent00, 
      ?prefixComponent01, 
      ?prefixComponent02, 
      ?prefixComponent03, 
      ?prefixComponent04, 
      ?prefixComponent05, 
      ?prefixComponent06, 
      ?prefixComponent07, 
      ?prefixComponent08, 
      ?prefixComponent09, 
      ?prefixComponent10, 
      ?prefixComponent11, 
      ?prefixComponent12, 
      ?prefixComponent13, 
      ?prefixComponent14, 
      ?prefixComponent15, 
      ?prefixComponent16, 
      ?prefixComponent17, 
      ?prefixComponent18, 
      ?prefixComponent19, 
      ?prefixComponent20, 
      ?prefixComponent21 
      ) AS ?prefixes ) . 
    BIND (CONCAT(?prefixes, "\n", ?ruleText) AS ?newRuleText) . 
}

Возможно, что приведенный выше запрос может включать определение префикса, основанное на ложном срабатывании, если определение префикса содержится во встроенной строке или комментарии. Например, буквальный "Greg’s solo: five measures"^^xsd:string приведет к тому, что приведенный выше запрос будет включать определение olo: префикс, возможно, излишне. Однако включение необязательных префиксов не оказало существенного влияния на производительность и не оказало влияния на корректность. Можно было бы сделать лучше, используя регулярное выражение вместо простого CONTAINS совпадения в запросе выше.

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