/* * Copyright 2013 JBoss Inc * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.drools.semantics.lang.dl; import org.drools.ClassObjectFilter; import org.drools.KnowledgeBase; import org.drools.KnowledgeBaseFactory; import org.drools.builder.KnowledgeBuilder; import org.drools.builder.KnowledgeBuilderFactory; import org.drools.builder.ResourceType; import org.drools.io.Resource; import org.drools.io.ResourceFactory; import org.drools.io.impl.ByteArrayResource; import org.drools.lang.DrlDumper; import org.drools.lang.api.DescrFactory; import org.drools.lang.api.PackageDescrBuilder; import org.drools.runtime.StatefulKnowledgeSession; import org.drools.semantics.NamedIndividual; import org.drools.semantics.builder.DLFactory; import org.drools.semantics.builder.DLFactoryBuilder; import org.drools.semantics.builder.DLFactoryConfiguration; import org.drools.semantics.builder.model.OntoModel; import org.drools.semantics.builder.reasoner.DLogicTransformer; import org.drools.semantics.builder.reasoner.TemplateRecognitionRuleBuilder; import org.junit.Ignore; import org.junit.Test; import org.semanticweb.owlapi.model.IRI; import org.semanticweb.owlapi.model.OWLClassExpression; import org.semanticweb.owlapi.model.OWLDataFactory; import org.semanticweb.owlapi.model.OWLObjectIntersectionOf; import org.semanticweb.owlapi.model.OWLObjectUnionOf; import org.semanticweb.owlapi.model.OWLOntology; import java.util.List; import java.util.Map; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @SuppressWarnings("restriction") public class DL_7_RuleTest { protected DLFactory factory = DLFactoryBuilder.newDLFactoryInstance(); @Test public void testPizzaOntologyRecognition() { Resource res = ResourceFactory.newClassPathResource( "ontologies/pizza.owl" ); OWLOntology pizza = factory.parseOntology( res ); OntoModel pizzaModel = factory.buildModel( "pizza", res, DLFactoryConfiguration.newConfiguration( OntoModel.Mode.FLAT, DLFactoryConfiguration.defaultAxiomGenerators ) ); String drl = new TemplateRecognitionRuleBuilder().createDRL( pizza, pizzaModel ); System.err.println( "***********************************************************************" ); System.err.println( drl ); System.err.println( "***********************************************************************" ); } @Test public void testExampleDNFRecognition() { Resource res = ResourceFactory.newClassPathResource( "ontologies/testDNF.owl" ); OWLOntology onto = factory.parseOntology( res ); OntoModel ontoModel = factory.buildModel( "test", res, DLFactoryConfiguration.newConfiguration( OntoModel.Mode.NONE, DLFactoryConfiguration.defaultAxiomGenerators ) ); String drl = new TemplateRecognitionRuleBuilder().createDRL( onto, ontoModel ); KnowledgeBuilder kBuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kBuilder.add( new ByteArrayResource( drl.getBytes() ), ResourceType.DRL ); String drl2 = "package t.x \n" + "import org.drools.semantics.NamedIndividual;\n" + "" + "rule Init when \n" + "then \n" + " NamedIndividual e = new NamedIndividual();\n" + " insert( e ); \n" + " don( e, W.class ); \n" + "end \n" + "" + "" + "rule Final when \n" + " $s : String() \n" + " $x : W() \n" + "then \n" + " retract( $s );\n " + " shed( $x, W.class ); \n " + "end \n"; kBuilder.add( new ByteArrayResource( drl2.getBytes() ), ResourceType.DRL ); if ( kBuilder.hasErrors() ) { fail( kBuilder.getErrors().toString() ); } KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); kbase.addKnowledgePackages( kBuilder.getKnowledgePackages() ); StatefulKnowledgeSession kSession = kbase.newStatefulKnowledgeSession(); kSession.fireAllRules(); for ( Object o : kSession.getObjects() ) { System.err.println( o ); } System.err.println( "----------" ); kSession.insert( "go" ); kSession.fireAllRules(); for ( Object o : kSession.getObjects() ) { System.err.println( o ); } } @Test public void testOneOfWithNamedIndividuals() { String owl = "Prefix(owl:=<http://www.w3.org/2002/07/owl#>)\n" + "Prefix(rdf:=<http://www.w3.org/1999/02/22-rdf-syntax-ns#>)\n" + "Prefix(xml:=<http://www.w3.org/XML/1998/namespace>)\n" + "Prefix(xsd:=<http://www.w3.org/2001/XMLSchema#>)\n" + "Prefix(rdfs:=<http://www.w3.org/2000/01/rdf-schema#>)\n" + "\n" + "\n" + "Ontology(<http://t/x>\n" + "\n" + "Declaration(Class(<http://t/x#X>))\n" + "Declaration(Class(<http://t/x#Y>))\n" + "EquivalentClasses(<http://t/x#Y> ObjectIntersectionOf(ObjectOneOf(<http://t/x#b> <http://t/x#a>) <http://t/x#X>))\n" + "Declaration(NamedIndividual(<http://t/x#a>))\n" + "Declaration(NamedIndividual(<http://t/x#b>))\n" + ")"; String drl2 = "package t.x \n" + "import org.drools.semantics.NamedIndividual;\n" + "" + "rule Init when \n" + "then \n" + " NamedIndividual e = new NamedIndividual( \"http://t/x#a\" );\n" + " insert( e ); \n" + " don( e, X.class, true ); \n" + "end \n" + ""; Resource res = ResourceFactory.newByteArrayResource( owl.getBytes() ); OWLOntology onto = factory.parseOntology( res ); OntoModel ontoModel = factory.buildModel( "test", res, DLFactoryConfiguration.newConfiguration( OntoModel.Mode.NONE, DLFactoryConfiguration.defaultAxiomGenerators ) ); String drl = new TemplateRecognitionRuleBuilder().createDRL( onto, ontoModel ); KnowledgeBuilder kBuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kBuilder.add( new ByteArrayResource( drl.getBytes() ), ResourceType.DRL ); kBuilder.add( new ByteArrayResource( drl2.getBytes() ), ResourceType.DRL ); if ( kBuilder.hasErrors() ) { fail( kBuilder.getErrors().toString() ); } KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); kbase.addKnowledgePackages( kBuilder.getKnowledgePackages() ); StatefulKnowledgeSession kSession = kbase.newStatefulKnowledgeSession(); kSession.fireAllRules(); for ( Object o : kSession.getObjects() ) { System.err.println( o ); } for ( Object o : kSession.getObjects( new ClassObjectFilter( NamedIndividual.class ) ) ) { NamedIndividual e = (NamedIndividual) o; assertTrue( ( (NamedIndividual) o ).hasTrait( "t.x.Y" ) ); } } @Test public void testDRLDumper() { PackageDescrBuilder packBuilder = DescrFactory.newPackage().name( "org.test" ) .newRule().name( "org.test" ) .lhs().and().or() .and().pattern().type( "Integer" ).end().pattern().type( "Long" ).end().end() .and().pattern().type( "String" ).end().end() .end().end().end() .rhs("") .end() .end(); String drl = new DrlDumper().dump( packBuilder.getDescr() ); System.out.println(drl); KnowledgeBuilder kb = KnowledgeBuilderFactory.newKnowledgeBuilder(); kb.add( new ByteArrayResource( drl.getBytes() ), ResourceType.DRL ); System.out.println( kb.getErrors() ); assertFalse( kb.hasErrors() ); } @Test public void testExampleDNFQuantifiersSome() { String owl = "" + "<?xml version=\"1.0\"?>\n" + "<rdf:RDF xmlns=\"http://t/x#\"\n" + " xml:base=\"http://t/x\"\n" + " xmlns:rdfs=\"http://www.w3.org/2000/01/rdf-schema#\"\n" + " xmlns:owl=\"http://www.w3.org/2002/07/owl#\"\n" + " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema#\"\n" + " xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\n" + " <owl:Ontology rdf:about=\"http://t/x\"/>\n" + " <owl:ObjectProperty rdf:about=\"http://t/x#objProp\"/>\n" + " <owl:Class rdf:about=\"http://t/x#D\"/>\n" + " <owl:Class rdf:about=\"http://t/x#E\">\n" + " <owl:equivalentClass>\n" + " <owl:Class>\n" + " <owl:intersectionOf rdf:parseType=\"Collection\">\n" + " <rdf:Description rdf:about=\"http://t/x#D\"/>\n" + " <owl:Restriction>\n" + " <owl:onProperty rdf:resource=\"http://t/x#objProp\"/>\n" + " <owl:someValuesFrom rdf:resource=\"http://t/x#F\"/>\n" + " </owl:Restriction>\n" + " </owl:intersectionOf>\n" + " </owl:Class>\n" + " </owl:equivalentClass>\n" + " </owl:Class>\n" + " <owl:Class rdf:about=\"http://t/x#F\"/>\n" + "</rdf:RDF>\n" + "\n"; String drl2 = "package t.x; \n" + "import org.drools.semantics.NamedIndividual; \n" + "" + "declare NamedIndividual end\n" + "" + "rule Init \n" + "when \n" + "then \n" + " NamedIndividual e1 = new NamedIndividual( \"X\" ); \n" + " insert( e1 );\n" + " NamedIndividual e2 = new NamedIndividual( \"Y\"); \n" + " insert( e2 );\n" + " " + " D d1 = don( e1, D.class, true ); \n" + " F f2 = don( e2, F.class, true ); \n" + " " + " modify ( d1 ) { \n" + " getObjProp().add( f2.getCore() );" + " } \n" + " modify ( f2.getCore() ) {} \n " + "end \n" + "" + "" + "rule Shed \n" + "when \n" + " $s : String( this == \"go\") \n" + " $x : E( $objs : objProp ) \n" + " $y : F( $z : core memberOf $objs ) \n" + "then \n" + " retract( $s ); \n" + " System.out.println( \"SUCCESS : E has been recognized \" );\n" + " shed( $y, F.class );" + "end \n" + "" + "" + "rule Shed_2 \n" + "when \n" + " $s : String( this == \"go2\") \n" + " $x : E( $objs : objProp ) \n" + " $y : F( $z : core memberOf $objs ) \n" + "then \n" + " retract( $s ); \n" + " System.out.println( \"SUCCESS : E has been recognized \" );\n" + " modify ( $x ) {\n" + " getObjProp().remove( $z ); \n" + " }\n" + " modify ( $y ) {} " + "end \n"; Resource res = ResourceFactory.newByteArrayResource( owl.getBytes() ); OWLOntology onto = factory.parseOntology( res ); OntoModel ontoModel = factory.buildModel( "test", res, DLFactoryConfiguration.newConfiguration( OntoModel.Mode.NONE, DLFactoryConfiguration.defaultAxiomGenerators ) ); String drl = new TemplateRecognitionRuleBuilder().createDRL( onto, ontoModel ); KnowledgeBuilder kBuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kBuilder.add( new ByteArrayResource( drl.getBytes() ), ResourceType.DRL ); kBuilder.add( new ByteArrayResource( drl2.getBytes() ), ResourceType.DRL ); if ( kBuilder.hasErrors() ) { fail( kBuilder.getErrors().toString() ); } KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); kbase.addKnowledgePackages( kBuilder.getKnowledgePackages() ); StatefulKnowledgeSession kSession = kbase.newStatefulKnowledgeSession(); kSession.fireAllRules(); for ( Object o : kSession.getObjects( new ClassObjectFilter( NamedIndividual.class ) ) ) { NamedIndividual e = (NamedIndividual) o; if ( e.getId().equals( "X" ) ) { assertTrue( e.hasTrait( "t.x.D" ) ); assertTrue( e.hasTrait( "t.x.E" ) ); assertFalse( e.hasTrait( "t.x.F" ) ); assertEquals( 1, ( (List) e._getDynamicProperties().get( "objProp" ) ).size() ); } else if ( e.getId().equals( "Y" ) ) { assertTrue( e.hasTrait( "t.x.F" ) ); assertFalse( e.hasTrait( "t.x.D" ) ); assertFalse( e.hasTrait( "t.x.E" ) ); } else { fail( "Unrecognized entity in WM" ); } } kSession.insert( "go" ); kSession.fireAllRules(); for ( Object o : kSession.getObjects( new ClassObjectFilter( NamedIndividual.class ) ) ) { NamedIndividual e = (NamedIndividual) o; if ( e.getId().equals( "X" ) ) { assertTrue( e.hasTrait( "t.x.D" ) ); assertFalse( e.hasTrait( "t.x.E" ) ); assertFalse( e.hasTrait( "t.x.F" ) ); assertEquals( 1, ( (List) e._getDynamicProperties().get( "objProp" ) ).size() ); } else if ( e.getId().equals( "Y" ) ) { assertFalse( e.hasTrait( "t.x.F" ) ); assertFalse( e.hasTrait( "t.x.D" ) ); assertFalse( e.hasTrait( "t.x.E" ) ); } else { fail( "Unrecognized entity in WM" ); } } kSession = kbase.newStatefulKnowledgeSession(); kSession.fireAllRules(); kSession.insert( "go2" ); kSession.fireAllRules(); for ( Object o : kSession.getObjects( new ClassObjectFilter( NamedIndividual.class ) ) ) { NamedIndividual e = (NamedIndividual) o; if ( e.getId().equals( "X" ) ) { assertTrue( e.hasTrait( "t.x.D" ) ); assertFalse( e.hasTrait( "t.x.E" ) ); assertFalse( e.hasTrait( "t.x.F" ) ); assertEquals( 0, ( (List) e._getDynamicProperties().get( "objProp" ) ).size() ); } else if ( e.getId().equals( "Y" ) ) { assertTrue( e.hasTrait( "t.x.F" ) ); assertFalse( e.hasTrait( "t.x.D" ) ); assertFalse( e.hasTrait( "t.x.E" ) ); } else { fail( "Unrecognized entity in WM" ); } } } @Test public void testExaTemplateRecognitionBuildermpleDNFQuantifiersOnly() { String owl = "" + "<?xml version=\"1.0\"?>\n" + "<rdf:RDF xmlns=\"http://t/x#\"\n" + " xml:base=\"http://t/x\"\n" + " xmlns:rdfs=\"http://www.w3.org/2000/01/rdf-schema#\"\n" + " xmlns:owl=\"http://www.w3.org/2002/07/owl#\"\n" + " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema#\"\n" + " xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\n" + " <owl:Ontology rdf:about=\"http://t/x\"/>\n" + " <owl:ObjectProperty rdf:about=\"http://t/x#objProp\"/>\n" + " <owl:Class rdf:about=\"http://t/x#D\"/>\n" + " <owl:Class rdf:about=\"http://t/x#E\">\n" + " <owl:equivalentClass>\n" + " <owl:Class>\n" + " <owl:intersectionOf rdf:parseType=\"Collection\">\n" + " <rdf:Description rdf:about=\"http://t/x#D\"/>\n" + " <owl:Restriction>\n" + " <owl:onProperty rdf:resource=\"http://t/x#objProp\"/>\n" + " <owl:allValuesFrom rdf:resource=\"http://t/x#F\"/>\n" + " </owl:Restriction>\n" + " </owl:intersectionOf>\n" + " </owl:Class>\n" + " </owl:equivalentClass>\n" + " </owl:Class>\n" + " <owl:Class rdf:about=\"http://t/x#F\"/>\n" + "</rdf:RDF>\n" + "\n"; String drl2 = "package t.x; \n" + "import org.drools.semantics.NamedIndividual; \n" + "import org.w3._2002._07.owl.Thing; \n" + "" + "declare NamedIndividual end\n" + "" + "rule Init \n" + "when \n" + "then \n" + " NamedIndividual e1 = new NamedIndividual( \"X\" ); \n" + " insert( e1 );\n" + " NamedIndividual e2 = new NamedIndividual( \"Y\" ); \n" + " insert( e2 );\n" + " NamedIndividual e3 = new NamedIndividual( \"Z\" ); \n" + " insert( e3 );\n" + " " + " D d1 = don( e1, D.class, true ); \n" + " F f2 = don( e2, F.class, true ); \n" + " F f3 = don( e3, F.class, true ); \n" + " " + " modify ( d1 ) { \n" + " getObjProp().add( f2.getCore() )," + " getObjProp().add( f3.getCore() );" + " } \n" + " modify ( f3.getCore() ) {} \n " + " modify ( f2.getCore() ) {} \n " + "end \n" + "" + "rule Log \n" + "when \n" + " $x : E() \n" + "then \n" + " System.out.println( \"RECOGNIZED \" + $x ); \n" + "end" ; Resource res = ResourceFactory.newByteArrayResource( owl.getBytes() ); OWLOntology onto = factory.parseOntology( res ); OntoModel ontoModel = factory.buildModel( "test", res, DLFactoryConfiguration.newConfiguration( OntoModel.Mode.NONE, DLFactoryConfiguration.defaultAxiomGenerators ) ); String drl = new TemplateRecognitionRuleBuilder().createDRL( onto, ontoModel ); KnowledgeBuilder kBuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kBuilder.add( new ByteArrayResource( drl.getBytes() ), ResourceType.DRL ); kBuilder.add( new ByteArrayResource( drl2.getBytes() ), ResourceType.DRL ); if ( kBuilder.hasErrors() ) { fail( kBuilder.getErrors().toString() ); } KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); kbase.addKnowledgePackages( kBuilder.getKnowledgePackages() ); StatefulKnowledgeSession kSession = kbase.newStatefulKnowledgeSession(); kSession.fireAllRules(); for ( Object o : kSession.getObjects( new ClassObjectFilter( NamedIndividual.class ) ) ) { NamedIndividual e = (NamedIndividual) o; if ( e.getId().equals( "X" ) ) { assertTrue( e.hasTrait( "t.x.D" ) ); assertTrue( e.hasTrait( "t.x.E" ) ); assertFalse( e.hasTrait( "t.x.F" ) ); assertEquals( 2, ( (List) e._getDynamicProperties().get( "objProp" ) ).size() ); } else if ( e.getId().equals( "Y" ) || e.getId().equals( "Z" ) ) { assertTrue( e.hasTrait( "t.x.F" ) ); assertFalse( e.hasTrait( "t.x.D" ) ); assertFalse( e.hasTrait( "t.x.E" ) ); } else { fail( "Unrecognized entity in WM" ); } } } @Test public void testExampleDNFDataProperties() { String owl = "<?xml version=\"1.0\"?>\n" + "<!DOCTYPE rdf:RDF [\n" + " <!ENTITY owl \"http://www.w3.org/2002/07/owl#\" >\n" + " <!ENTITY xsd \"http://www.w3.org/2001/XMLSchema#\" >\n" + " <!ENTITY rdfs \"http://www.w3.org/2000/01/rdf-schema#\" >\n" + " <!ENTITY rdf \"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" >\n" + "]>\n" + "<rdf:RDF xmlns=\"http://t/x#\"\n" + " xml:base=\"http://t/x\"\n" + " xmlns:rdfs=\"http://www.w3.org/2000/01/rdf-schema#\"\n" + " xmlns:owl=\"http://www.w3.org/2002/07/owl#\"\n" + " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema#\"\n" + " xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\n" + " <owl:Ontology rdf:about=\"http://t/x\"/>\n" + " <owl:DatatypeProperty rdf:about=\"http://t/x#dataProp\">\n" + " <rdfs:range rdf:resource=\"&xsd;string\"/>\n" + " </owl:DatatypeProperty>\n" + " <owl:Class rdf:about=\"http://t/x#E\">\n" + " <owl:equivalentClass>\n" + " <owl:Class>\n" + " <owl:intersectionOf rdf:parseType=\"Collection\">\n" + " <owl:Class>\n" + " <owl:unionOf rdf:parseType=\"Collection\">\n" + " <owl:Restriction>\n" + " <owl:onProperty rdf:resource=\"http://t/x#dataProp\"/>\n" + " <owl:hasValue>a</owl:hasValue>\n" + " </owl:Restriction>\n" + " <owl:Restriction>\n" + " <owl:onProperty rdf:resource=\"http://t/x#dataProp\"/>\n" + " <owl:hasValue>b</owl:hasValue>\n" + " </owl:Restriction>\n" + " </owl:unionOf>\n" + " </owl:Class>\n" + " <owl:Restriction>\n" + " <owl:onProperty rdf:resource=\"http://t/x#dataProp\"/>\n" + " <owl:someValuesFrom rdf:resource=\"&xsd;string\"/>\n" + " </owl:Restriction>\n" + " <owl:Restriction>\n" + " <owl:onProperty rdf:resource=\"http://t/x#dataProp\"/>\n" + " <owl:allValuesFrom rdf:resource=\"&xsd;string\"/>\n" + " </owl:Restriction>\n" + " </owl:intersectionOf>\n" + " </owl:Class>\n" + " </owl:equivalentClass>\n" + " </owl:Class>\n" + "</rdf:RDF>\n"; String drl2 = "package t.x; \n" + "import org.drools.semantics.NamedIndividual; \n" + "import org.w3._2002._07.owl.Thing; \n" + "" + "declare NamedIndividual end\n" + "" + "rule Init \n" + "when \n" + "then \n" + " NamedIndividual e1 = new NamedIndividual( \"X\" ); \n" + " insert( e1 );\n" + " RootThing t = don( e1, RootThing.class, true ); \n" + " modify ( t ) { \n" + " getDataProp().add( \"a\" )," + " getDataProp().add( \"c\" );" + " } \n" + "end \n" + "" + "rule Log \n" + "when \n" + " $x : E() \n" + "then \n" + " System.out.println( \"RECOGNIZED \" + $x ); \n" + "end" ; Resource res = ResourceFactory.newByteArrayResource( owl.getBytes() ); OWLOntology onto = factory.parseOntology( res ); OntoModel ontoModel = factory.buildModel( "test", res, DLFactoryConfiguration.newConfiguration( OntoModel.Mode.NONE, DLFactoryConfiguration.defaultAxiomGenerators ) ); String drl = new TemplateRecognitionRuleBuilder().createDRL( onto, ontoModel ); KnowledgeBuilder kBuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kBuilder.add( new ByteArrayResource( drl.getBytes() ), ResourceType.DRL ); kBuilder.add( new ByteArrayResource( drl2.getBytes() ), ResourceType.DRL ); if ( kBuilder.hasErrors() ) { fail( kBuilder.getErrors().toString() ); } KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); kbase.addKnowledgePackages( kBuilder.getKnowledgePackages() ); StatefulKnowledgeSession kSession = kbase.newStatefulKnowledgeSession(); kSession.fireAllRules(); for ( Object o : kSession.getObjects( new ClassObjectFilter( NamedIndividual.class ) ) ) { assertTrue( ((NamedIndividual) o).hasTrait( "t.x.E" ) ); } } @Test public void testMixedDataTypes() { String owl = "<?xml version=\"1.0\"?>\n" + "<!DOCTYPE rdf:RDF [\n" + " <!ENTITY owl \"http://www.w3.org/2002/07/owl#\" >\n" + " <!ENTITY xsd \"http://www.w3.org/2001/XMLSchema#\" >\n" + " <!ENTITY rdfs \"http://www.w3.org/2000/01/rdf-schema#\" >\n" + " <!ENTITY rdf \"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" >\n" + "]>\n" + "<rdf:RDF xmlns=\"http://t/x#\"\n" + " xml:base=\"http://t/x\"\n" + " xmlns:rdfs=\"http://www.w3.org/2000/01/rdf-schema#\"\n" + " xmlns:owl=\"http://www.w3.org/2002/07/owl#\"\n" + " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema#\"\n" + " xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\n" + " <owl:Ontology rdf:about=\"http://t/x\"/>\n" + " <owl:DatatypeProperty rdf:about=\"http://t/x#dataProp\">\n" + " <rdfs:range rdf:resource=\"&xsd;string\"/>\n" + " </owl:DatatypeProperty>\n" + " <owl:Class rdf:about=\"http://t/x#E\">\n" + " <owl:equivalentClass>\n" + " <owl:Restriction>\n" + " <owl:onProperty rdf:resource=\"http://t/x#dataProp\"/>\n" + " <owl:someValuesFrom>\n" + " <rdfs:Datatype>\n" + " <owl:unionOf rdf:parseType=\"Collection\">\n" + " <rdf:Description rdf:about=\"&xsd;int\"/>\n" + " <rdf:Description rdf:about=\"&xsd;string\"/>\n" + " </owl:unionOf>\n" + " </rdfs:Datatype>\n" + " </owl:someValuesFrom>\n" + " </owl:Restriction>\n" + " </owl:equivalentClass>\n" + " </owl:Class>\n" + "</rdf:RDF>"; String drl2 = "package t.x; \n" + "import org.drools.semantics.NamedIndividual; \n" + "import org.w3._2002._07.owl.Thing; \n" + "" + "declare NamedIndividual end\n" + "" + "rule Init \n" + "when \n" + "then \n" + " NamedIndividual e1 = new NamedIndividual( \"X\" ); \n" + " insert( e1 );\n" + " RootThing t = don( e1, RootThing.class, true ); \n" + " modify ( t ) { \n" + " getDataProp().add( new Integer(42) )," + " getDataProp().add( \"Hello\" )," + " getDataProp().add( 23.0 );" + " } \n" + "end \n" + "" + "rule Log \n" + "when \n" + " $x : E() \n" + "then \n" + " System.out.println( \"RECOGNIZED \" + $x ); \n" + "end" ; Resource res = ResourceFactory.newByteArrayResource( owl.getBytes() ); OWLOntology onto = factory.parseOntology( res ); OntoModel ontoModel = factory.buildModel( "test", res, DLFactoryConfiguration.newConfiguration( OntoModel.Mode.NONE, DLFactoryConfiguration.defaultAxiomGenerators ) ); String drl = new TemplateRecognitionRuleBuilder().createDRL( onto, ontoModel ); KnowledgeBuilder kBuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kBuilder.add( new ByteArrayResource( drl.getBytes() ), ResourceType.DRL ); kBuilder.add( new ByteArrayResource( drl2.getBytes() ), ResourceType.DRL ); System.err.println( kBuilder.getErrors() ); assertFalse( kBuilder.hasErrors() ); KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); kbase.addKnowledgePackages( kBuilder.getKnowledgePackages() ); StatefulKnowledgeSession kSession = kbase.newStatefulKnowledgeSession(); kSession.fireAllRules(); for ( Object o : kSession.getObjects( new ClassObjectFilter( NamedIndividual.class ) ) ) { assertTrue( ((NamedIndividual) o).hasTrait( "t.x.E" ) ); } } @Test public void testDNFConversion() { Resource res = ResourceFactory.newClassPathResource( "ontologies/testDNF.owl" ); OWLOntology onto = factory.parseOntology( res ); OWLDataFactory fac = onto.getOWLOntologyManager().getOWLDataFactory(); Map<OWLClassExpression, OWLClassExpression> dnf = new DLogicTransformer( onto ).getDefinitions(); String ns = "http://t/x#"; OWLClassExpression a = fac.getOWLClass( IRI.create( ns + "A" ) ); OWLClassExpression b = fac.getOWLClass( IRI.create( ns + "B" ) ); OWLClassExpression c = fac.getOWLClass( IRI.create( ns + "C" ) ); OWLClassExpression d = fac.getOWLClass( IRI.create( ns + "D" ) ); OWLClassExpression e = fac.getOWLClass( IRI.create( ns + "E" ) ); OWLClassExpression f = fac.getOWLClass( IRI.create( ns + "F" ) ); assertNotNull( a ); assertNotNull( b ); assertNotNull( c ); assertNotNull( d ); assertNotNull( e ); assertNotNull( f ); assertTrue( dnf.containsKey( a ) ); assertTrue( dnf.containsKey( b ) ); assertTrue( dnf.containsKey( c ) ); assertTrue( dnf.containsKey( d ) ); assertTrue( dnf.containsKey( e ) ); assertTrue( dnf.containsKey( f ) ); checkPlainNormal( dnf.get( a ), 6, 3 ); checkPlainNormal( dnf.get( b ), 1, 4 ); checkPlainNormal( dnf.get( c ), 1, 4 ); checkPlainNormal( dnf.get( d ), 4, 1 ); checkNormal(dnf.get(e), 2, 3); checkNormal(dnf.get(f), 2, 2); } private void checkPlainNormal( OWLClassExpression x, int ands, int args ) { checkNormal( x, ands, args, true ); } private void checkNormal( OWLClassExpression x, int ands, int args ) { checkNormal( x, ands, args, false ); } private void checkNormal( OWLClassExpression x, int ands, int args, boolean allNamed ) { assertTrue( x instanceof OWLObjectUnionOf ); OWLObjectUnionOf xnorm = (OWLObjectUnionOf) x; assertEquals( ands, xnorm.getOperands().size() ); for ( OWLClassExpression expr : xnorm.getOperands() ) { assertTrue( expr instanceof OWLObjectIntersectionOf ); OWLObjectIntersectionOf xinner = (OWLObjectIntersectionOf) expr; assertEquals( args, xinner.getOperands().size() ); if ( allNamed ) { for( OWLClassExpression arg : xinner.getOperands() ) { assertFalse( arg.isAnonymous() ); } } } } }