Creating New Classes and Individuals with SWRL in Protege

The name of the pictureThe name of the pictureThe name of the pictureClash Royale CLAN TAG#URR8PPP



Creating New Classes and Individuals with SWRL in Protege



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




1 Answer
1



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:



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.


##





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 at 18:08



"c2038_2adb_4d12_b3ee_326cc45ffa2b"


"patient1"


Name(?patient, "patient" + charAt(?ssn, length(?ssn) - 1))





@Wassadamo, unfortunately, I don't know.
– Stanislav Kralin
Aug 15 at 5: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 at 23:35






By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Popular posts from this blog

Firebase Auth - with Email and Password - Check user already registered

Dynamically update html content plain JS

How to determine optimal route across keyboard