3

I've been trying to write SWRL rules that automate creation of new entities and their assignment to classes and predicates in a Protege ontology. The code here didn't result in creation of even one individual, neither did the example in the readme work.

For clarity, here is the rule I'm trying to make work:

Person(?person) ^ hasSSN(?person, ?ssn) ^ swrlx:makeOWLThing(?patient, ?person) -> Patient(?patient) ^ hasPID(?patient, ?ssn)

In this ontology:

@prefix : <http://www.semanticweb.org/richard/ontologies/2018/7/untitled-ontology-48#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix xml: <http://www.w3.org/XML/1998/namespace> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@base <http://www.semanticweb.org/richard/ontologies/2018/7/untitled-ontology-48> .

<http://www.semanticweb.org/richard/ontologies/2018/7/untitled-ontology-48> rdf:type owl:Ontology .

#################################################################
#    Annotation properties
#################################################################

###  http://swrl.stanford.edu/ontologies/3.3/swrla.owl#isRuleEnabled
<http://swrl.stanford.edu/ontologies/3.3/swrla.owl#isRuleEnabled> rdf:type owl:AnnotationProperty .


#################################################################
#    Data properties
#################################################################

###  http://www.semanticweb.org/richard/ontologies/2018/7/untitled-ontology-48#hasPID
:hasPID rdf:type owl:DatatypeProperty .


###  http://www.semanticweb.org/richard/ontologies/2018/7/untitled-ontology-48#hasSSN
:hasSSN rdf:type owl:DatatypeProperty .


#################################################################
#    Classes
#################################################################

###  http://www.semanticweb.org/richard/ontologies/2018/7/untitled-ontology-48#Patient
:Patient rdf:type owl:Class .


###  http://www.semanticweb.org/richard/ontologies/2018/7/untitled-ontology-48#Person
:Person rdf:type owl:Class .


#################################################################
#    Individuals
#################################################################

###  http://www.semanticweb.org/richard/ontologies/2018/7/untitled-ontology-48#person1
:person1 rdf:type owl:NamedIndividual ,
                  :Person ;
         :hasSSN 1001 .


###  http://www.semanticweb.org/richard/ontologies/2018/7/untitled-ontology-48#person2
:person2 rdf:type owl:NamedIndividual ,
                  :Person ;
         :hasSSN 1002 .


###  http://www.semanticweb.org/richard/ontologies/2018/7/untitled-ontology-48#person3
:person3 rdf:type owl:NamedIndividual ,
                  :Person ;
         :hasSSN 1003 .


#################################################################
#    Rules
#################################################################

:person rdf:type <http://www.w3.org/2003/11/swrl#Variable> .

:ssn rdf:type <http://www.w3.org/2003/11/swrl#Variable> .

:patient rdf:type <http://www.w3.org/2003/11/swrl#Variable> .

[ <http://swrl.stanford.edu/ontologies/3.3/swrla.owl#isRuleEnabled> "true"^^xsd:boolean ;
   rdfs:comment "Patient For Every Person With PID Equal To SSN"^^xsd:string ;
   rdfs:label "PatientForEveryPersonWithPIDEqualToSSN"^^xsd:string ;
   rdf:type <http://www.w3.org/2003/11/swrl#Imp> ;
   <http://www.w3.org/2003/11/swrl#body> [ rdf:type <http://www.w3.org/2003/11/swrl#AtomList> ;
                                           rdf:first [ rdf:type <http://www.w3.org/2003/11/swrl#ClassAtom> ;
                                                       <http://www.w3.org/2003/11/swrl#classPredicate> :Person ;
                                                       <http://www.w3.org/2003/11/swrl#argument1> :person
                                                     ] ;
                                           rdf:rest [ rdf:type <http://www.w3.org/2003/11/swrl#AtomList> ;
                                                      rdf:first [ rdf:type <http://www.w3.org/2003/11/swrl#DatavaluedPropertyAtom> ;
                                                                  <http://www.w3.org/2003/11/swrl#propertyPredicate> :hasSSN ;
                                                                  <http://www.w3.org/2003/11/swrl#argument1> :person ;
                                                                  <http://www.w3.org/2003/11/swrl#argument2> :ssn
                                                                ] ;
                                                      rdf:rest [ rdf:type <http://www.w3.org/2003/11/swrl#AtomList> ;
                                                                 rdf:first [ rdf:type <http://www.w3.org/2003/11/swrl#BuiltinAtom> ;
                                                                             <http://www.w3.org/2003/11/swrl#builtin> <http://swrl.stanford.edu/ontologies/built-ins/3.3/swrlx.owl#makeOWLThing> ;
                                                                             <http://www.w3.org/2003/11/swrl#arguments> ( :patient
                                                                                                                          :person
                                                                                                                        )
                                                                           ] ;
                                                                 rdf:rest rdf:nil
                                                               ]
                                                    ]
                                         ] ;
   <http://www.w3.org/2003/11/swrl#head> [ rdf:type <http://www.w3.org/2003/11/swrl#AtomList> ;
                                           rdf:first [ rdf:type <http://www.w3.org/2003/11/swrl#ClassAtom> ;
                                                       <http://www.w3.org/2003/11/swrl#classPredicate> :Patient ;
                                                       <http://www.w3.org/2003/11/swrl#argument1> :patient
                                                     ] ;
                                           rdf:rest [ rdf:type <http://www.w3.org/2003/11/swrl#AtomList> ;
                                                      rdf:first [ rdf:type <http://www.w3.org/2003/11/swrl#DatavaluedPropertyAtom> ;
                                                                  <http://www.w3.org/2003/11/swrl#propertyPredicate> :hasPID ;
                                                                  <http://www.w3.org/2003/11/swrl#argument1> :patient ;
                                                                  <http://www.w3.org/2003/11/swrl#argument2> :ssn
                                                                ] ;
                                                      rdf:rest rdf:nil
                                                    ]
                                         ]
 ] .

###  Generated by the OWL API (version 4.2.8.20170104-2310) https://github.com/owlcs/owlapi
Wassadamo
  • 1,176
  • 12
  • 32

2 Answers2

4

Pellet doesn't support SWRLX:

 WARNING: Ignoring rule Rule([Person(?person), hasSSN(?person,?ssn), makeOWLThing([?patient, ?person])] => [Patient(?patient), hasPID(?patient,?ssn)]):
 No builtin for http://swrl.stanford.edu/ontologies/built-ins/3.3/swrlx.owl#makeOWLThing

However, you can use Drools translation. On the SWRLTab, press:

  1. OWL+SWRL -> Drools
  2. Run Drools
  3. Drools -> OWL

This is what was generated (in the Turtle syntax):

@prefix p1: <http://www.semanticweb.org/richard/ontologies/2018/7/untitled-ontology-48#> .
@prefix p2: <http://www.semanticweb.org/richard/ontologies/2018/7/untitled-ontology-48##> .

# ...

p2:d5d68a85_03f9_4a69_8c07_9f1a57ffe7aa rdf:type owl:NamedIndividual, p1:Patient ;
                                        p1:hasPID 1003 .

p2:c8c3_3ad6_4c49_b9f6_940f711e8d5f rdf:type owl:NamedIndividual, p1:Patient ;
                                    p1:hasPID 1002 .

p2:c2038_2adb_4d12_b3ee_326cc45ffa2b rdf:type owl:NamedIndividual, p1:Patient ;
                                     p1:hasPID 1001 .

Please note double ## in the generated URIs.

Stanislav Kralin
  • 11,070
  • 4
  • 35
  • 58
  • Thanks! This worked for me. Is there a way to change the name of this URI `"c2038_2adb_4d12_b3ee_326cc45ffa2b"` to `"patient1"` in SWRL? Something like: `Name(?patient, "patient" + charAt(?ssn, length(?ssn) - 1))` – Wassadamo Aug 14 '18 at 18:08
  • @Wassadamo, unfortunately, I don't know. – Stanislav Kralin Aug 15 '18 at 05:39
  • I read somewhere that it is bad practice to change these IRI's anyway. Because it violates some desirable property...something like opacity in naming. Can't find the link. I suppose if someone wants to display names of patients too, that should be done so with an auto-generated annotation/names field or something. – Wassadamo Aug 20 '18 at 23:35
  • 1
    @Wassadamo, FYI: Protege allows to render entities by anotation property, e. g. `rdfs:label` (see the *View* menu). – Stanislav Kralin Oct 05 '18 at 18:52
0

I included a chapter on SWRL in my revised Protege Pizza Tutorial where I walk through writing rules, testing them with sample data, and debugging them with SQWRL: https://www.michaeldebellis.com/post/new-protege-pizza-tutorial I'm also writing a new blog post on how to create a custom Rules tab for SWRL using the Rules view in Protege. The SWRLTab is my default but it only works with IRIs not with rdfs:labels. For ontologies (e.g., OBO) that use labels the Rules view is better. I'm going to publish that post on my blog sometime today.