Когда запускается правило SPIN:?

Я использую TopBraid Free Edition для создания онтологий OWL с правилами SPIN. Я загружаю онтологию и правила SPIN в Sesame OpenRDF Workbench:

Application Name    OpenRDF Workbench
Version 4.1.2
Runtime Information
Operating System    Windows 8.1 6.3 (amd64)
Java Runtime    Oracle Corporation Java HotSpot(TM) 64-Bit Server VM (1.8.0_91)
Process User    Greg
Memory
Used    646 MB
Maximum 3463 MB

Я создал простую тестовую онтологию. Он имеет один класс с одним правилом SPIN и одним свойством типа данных.

CONSTRUCT {
    ?this BugReproduction:hasTimeStamp ?timeStamp .
}
WHERE {
    BIND (now() AS ?timeStamp) .
}

Правило SPIN добавляет временную метку xsd:dateTime к тестовому экземпляру моего тестового класса. Вот RDF для всей тестовой онтологии, включая мой класс, свойство типа данных и правило (краткое):

    <?xml version="1.0"?>
<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:owl="http://www.w3.org/2002/07/owl#"
    xmlns:sp="http://spinrdf.org/sp#"
    xmlns:BugReproduction="http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/BugReproduction#"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
    xmlns:spin="http://spinrdf.org/spin#"
    xmlns:spl="http://spinrdf.org/spl#"
    xmlns:arg="http://spinrdf.org/arg#"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
  xml:base="http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/BugReproduction">
  <owl:Ontology rdf:about="">
    <owl:imports rdf:resource="http://spinrdf.org/spl"/>
    <owl:versionInfo rdf:datatype="http://www.w3.org/2001/XMLSchema#string"
    >Created with TopBraid Composer</owl:versionInfo>
  </owl:Ontology>
  <owl:Class rdf:ID="TimeStampBug">
    <rdfs:subClassOf rdf:resource="http://www.w3.org/2002/07/owl#Thing"/>
    <spin:rule>
      <sp:Construct>
        <sp:templates rdf:parseType="Collection">
          <rdf:Description>
            <sp:object rdf:parseType="Resource">
              <sp:varName rdf:datatype="http://www.w3.org/2001/XMLSchema#string"
              >timeStamp</sp:varName>
            </sp:object>
            <sp:predicate>
              <owl:DatatypeProperty rdf:ID="hasTimeStamp"/>
            </sp:predicate>
            <sp:subject rdf:resource="http://spinrdf.org/spin#_this"/>
          </rdf:Description>
        </sp:templates>
        <sp:where rdf:parseType="Collection">
          <sp:Bind>
            <sp:expression>
              <sp:now/>
            </sp:expression>
            <sp:variable rdf:parseType="Resource">
              <sp:varName rdf:datatype="http://www.w3.org/2001/XMLSchema#string"
              >timeStamp</sp:varName>
            </sp:variable>
          </sp:Bind>
        </sp:where>
      </sp:Construct>
    </spin:rule>
  </owl:Class>
  <owl:DatatypeProperty rdf:about="#hasTimeStamp">
    <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#dateTime"/>
  </owl:DatatypeProperty>
</rdf:RDF>

<!-- Created with TopBraid -->

Итак, очистите мой репозиторий SPIN в Sesame и используйте команду Modify/Add рабочей среды (со снятым флажком «использовать базовый URI в качестве идентификатора контекста», что важно, чтобы избежать ошибки). Затем я использую запрос обновления SPARQL для создания тестового экземпляра моего класса:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX sxxicc: <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/SXXIComplianceCheck#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX sp: <http://spinrdf.org/sp#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX smf: <http://topbraid.org/sparqlmotionfunctions#>
PREFIX fn: <http://www.w3.org/2005/xpath-functions#>
PREFIX spl: <http://spinrdf.org/spl#>
PREFIX spin: <http://spinrdf.org/spin#>
PREFIX arg: <http://spinrdf.org/arg#>
PREFIX SXXIComplianceCheckIndividuals: <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/SXXIComplianceCheckIndividuals#>
PREFIX sxxicci: <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/SXXIComplianceCheckIndividuals#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX bugs: <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/BugReproduction#>
PREFIX bugsi: <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/BugReproductionInstantiations#>

INSERT DATA {
    bugsi:aTimeStampBug_test1 a bugs:TimeStampBug .
}

Затем я исследую полученный результат bugsi:aTimeStampBug_test1, чтобы обнаружить, что правило SPIN: запустилось несколько раз и произвело несколько временных меток. Количество временных меток варьируется от теста к тесту. Вот один пример результата:

Subject 
Predicate
Object
Context
<http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/BugReproductionInstantiations#aTimeStampBug_test1>
    BugReproduction:hasTimeStamp
    2016-07-11T20:56:58.571-05:00   
    <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/BugReproductionInstantiations#aTimeStampBug_test1>
    BugReproduction:hasTimeStamp
    2016-07-11T20:56:58.592-05:00   
    <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/BugReproductionInstantiations#aTimeStampBug_test1>
    BugReproduction:hasTimeStamp
    2016-07-11T20:56:58.594-05:00   
    <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/BugReproductionInstantiations#aTimeStampBug_test1>
    BugReproduction:hasTimeStamp
    2016-07-11T20:56:58.595-05:00   
    <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/BugReproductionInstantiations#aTimeStampBug_test1>
    BugReproduction:hasTimeStamp
    2016-07-11T20:56:58.596-05:00   
    <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/BugReproductionInstantiations#aTimeStampBug_test1>
    BugReproduction:hasTimeStamp
    2016-07-11T20:56:58.597-05:00   
    <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/BugReproductionInstantiations#aTimeStampBug_test1>
    BugReproduction:hasTimeStamp
    2016-07-11T20:56:58.598-05:00   
    <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/BugReproductionInstantiations#aTimeStampBug_test1>
    BugReproduction:hasTimeStamp
    2016-07-11T20:56:58.599-05:00   
    <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/BugReproductionInstantiations#aTimeStampBug_test1>
    BugReproduction:hasTimeStamp
    2016-07-11T20:56:58.600-05:00   
    <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/BugReproductionInstantiations#aTimeStampBug_test1>
    BugReproduction:hasTimeStamp
    2016-07-11T20:56:58.601-05:00   
    <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/BugReproductionInstantiations#aTimeStampBug_test1>
    BugReproduction:hasTimeStamp
    2016-07-11T20:56:58.602-05:00   

Итак, мое правило SPIN: запустилось несколько раз для одного экземпляра класса. Сколько раз должно выполняться правило SPIN: для создания экземпляра класса? Я думал, что это будет работать только один раз, но, похоже, я ошибаюсь.


person Greg Cox    schedule 12.07.2016    source источник
comment
Возможно, вам лучше спросить об этом в группе пользователей rdf4j или опубликовать проблему как проблему на github.   -  person Jeen Broekstra    schedule 12.07.2016
comment
Он должен запускаться только один раз для каждого члена класса.   -  person scotthenninger    schedule 12.07.2016
comment
Спасибо @scotthenninger. Я хотел подтвердить это, прежде чем отправить это на github в качестве отчета об ошибке для rdf4j. Если я получу там полезный ответ, я опубликую его здесь для полноты этой записи.   -  person Greg Cox    schedule 12.07.2016
comment
Я разместил это на gethub, как предложила Джин Брокстра, и это было помечено как ошибка. Я обновлю, когда будет больше информации.   -  person Greg Cox    schedule 13.07.2016


Ответы (1)


SPIN:rule запускается на экземпляре класса всякий раз, когда этот экземпляр класса изменяется. Пример, который я разместил, устанавливает бесконечный цикл изменений, генерируемых моим правилом, генерирующим другой запуск правила, генерирующий другое изменение (новую отметку времени) и т. д., пока не будет достигнут какой-то неясный предел. Ограничение, вероятно, связано с общим состоянием Sesame (например, ресурс или время ожидания), поэтому я получаю переменное количество отметок времени. Простое решение состоит в том, чтобы вместо этого использовать SPIN:constructor, который запускается только при создании экземпляра (когда класс утверждается), а не всякий раз, когда экземпляр изменяется.

person Greg Cox    schedule 14.07.2016