2016-07-12 5 views
1

J'utilise TopBraid Free Edition pour créer des ontologies OWL avec des règles SPIN. Je charger les règles de l'ontologie et SPIN dans Sesame OpenRDF Workbench:Quand une règle SPIN: fonctionne-t-elle?

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 

J'ai créé une ontologie de test simple. Il a une classe avec une règle SPIN et une propriété de type de données.

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

La règle de SPIN ajoute un horodatage xsd:dateTime à l'instance de test de ma classe de test. Voici le RDF pour l'ontologie de test complet, y compris ma classe, propriété de type de données, et la règle (courte):

<?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 --> 

Donc, effacer mon dépôt SPIN dans Sesame et utiliser la commande Modifier/Ajouter de la table de travail (avec la « base d'utilisation URI comme identificateur de contexte "case non cochée ce qui est important pour éviter un bug). Puis-je utiliser une requête de mise à jour SPARQL pour créer une instance de test de ma classe:

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 . 
} 

J'explorons alors le bugsi résultant: individuel aTimeStampBug_test1, pour trouver le SPIN: règle a été exécutée à plusieurs reprises et produit plusieurs horodatages. Le nombre d'horodatages varie d'un test à l'autre. Voici un résultat exemple:

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 

Alors, mon SPIN: règle a été exécutée à plusieurs reprises pour une instanciation de la classe. Combien de fois une règle SPIN: devrait-elle fonctionner pour une instanciation d'une classe? Je pensais que cela ne fonctionnerait qu'une fois, mais il semble que je me trompe.

+0

Vous feriez peut-être mieux de poser cette question sur le groupe d'utilisateurs rdf4j, ou postez le problème en tant que problème de github. –

+0

Il ne devrait être exécuté qu'une fois par membre de la classe. – scotthenninger

+0

Merci @scotthenninger. Je voulais confirmer cela avant de prendre ceci à github comme un rapport de bug pour rdf4j. Si j'obtiens une réponse utile, je l'afficherai ici pour l'exhaustivité de ce dossier. –

Répondre

0

Un SPIN:rule s'exécute sur une instance d'une classe chaque fois que cette instance d'une classe est modifiée. L'exemple que j'ai posté met en place une boucle infinie de changements générés par ma règle générant une autre exécution de règle générant un autre changement (nouvel horodatage), etc. jusqu'à ce qu'une limite obscure soit atteinte. La limite est probablement liée à l'état général de Sésame (par exemple, la ressource ou le délai d'attente), donc j'obtiens un nombre variable d'horodatages. Une solution simple consiste à utiliser un SPIN:constructor à la place qui ne s'exécute qu'à l'instanciation (lorsque la classe est affirmée), et non à chaque fois que l'instanciation change.