Как указать 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, но я не знаю как.
А теперь кровавые подробности, чтобы сделать эту ситуацию воспроизводимой...
- Создайте репозиторий с поддержкой SPIN в RDF4J, используя рабочую среду RDF4J. Шахта называется TakeRDF4J4SPIN (Хранилища → Новый Хранилище)
- Очистить репозиторий с помощью рабочей среды RDF4J (Изменить → Очистить)
- Загрузите 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) .
}
- Попытка создать экземпляр
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
- Теперь спрячьте конструкторы 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 .
}
Теперь повторно запустите запрос на обновление SPARQL, показанный на шаге 4, чтобы создать экземпляр тестового класса. На этот раз запрос на обновление должен выполняться без ошибок.
Теперь используйте функцию 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
совпадения в запросе выше.