> -----Original Message-----
> From: Joshua TAYLOR [mailto:[email protected]]
> Sent: Friday, March 29, 2013 11:19 AM
> To: [email protected]
> Subject: Re: testing assignment of invalid range
>
> I don't see anything that would make anything invalid. There's no declaration 
> that the classes Male and Female are disjoint.  By adding [p1 hasSex p2] to 
> the model, you'll be able to infer that [p2 rdf:type Sex], though, and that's 
> expected.  Since the domain of hasSex is p2, anything that appears as the 
> object of a hasSex statement is inferred to be a Sex.
>
> If you can elaborate on what invalidity/inconsistency you expected to 
> observe, someone can probably tell you what changes you'll need to make to 
> the model to get it.
>
> //JT
>
>
> On Fri, Mar 29, 2013 at 10:08 AM, David Jordan <[email protected]> wrote:
>
> >
> > I am writing a small test to check whether assignment of an invalid
> > value is caught and how long it takes.
> >
> > Here is the relevant part of the ontology:
> >
> > :Sex rdf:type rdfs:Class ;
> >        rdfs:label "Sex" .
> >
> > :Male rdfs:subClassOf :Sex ;
> >        rdfs:label "Male" .
> >
> > :Female rdfs:subClassOf :Sex ;
> >        rdfs:label "Female" .
> >
> > :Individual rdf:type owl:Class .
> >
> > :hasSex rdf:type  owl:ObjectProperty ;
> >        rdfs:domain :Individual ;
> >        rdf:type owl:FunctionalProperty ;
> >        rdfs:range :Sex .
> >
> >
> > Here is the relevant Java code:
> >
> > From base class TestBase:
> >        public OntModel getGenealogyOntologyModel(){
> >               if( genealogyOntModel == null ){
> >                      Model model = getGenealogyModel();
> >                      OntModelSpec spec = new
> > OntModelSpec(OntModelSpec.OWL_MEM_MICRO_RULE_INF);
> >                      genealogyOntModel =
> > ModelFactory.createOntologyModel(spec, model);
> >               }
> >               return genealogyOntModel;
> >        }
> >
> >
> > public class InvalidPropertyValueTest extends TestBase {
> >        private static final String P1 = GENEALOGY_MODEL_NAME + "P1";
> >        private static final String P2 = GENEALOGY_MODEL_NAME + "P2";
> >        private static final String HAS_SEX = GENEALOGY_MODEL_NAME +
> > "hasSex";
> >
> >        @Test
> >        public void testSetInvalidRange(){
> >               OntModel omodel = getGenealogyOntologyModel();
> >               Individual p1 = omodel.getIndividual(P1);
> >               Individual p2 = omodel.getIndividual(P2);
> >               Property hasSex = omodel.getProperty(HAS_SEX);
> >               omodel.add(omodel.createStatement(p1, hasSex, p2));
> >               omodel.rebind();
> >               ValidityReport validity = omodel.validate();
> >               boolean isValid = validity.isValid();
> >               if( !isValid ){
> >                      Iterator<ValidityReport.Report> iter =
> > validity.getReports();
> >                      while( iter.hasNext() ){
> >                            ValidityReport.Report report = iter.next();
> >                            System.out.println(report.toString());
> >                      }
> >               }
> >        }
> > }
> >
> > The problem is that isValid is returning true, I expected false. What
> > am I doing wrong?
> > Am I using the wrong OntModelSpec?
> >
> > David Jordan
> > Senior Software Developer
> > SAS Institute Inc.
> > Health & Life Sciences, Research & Development Bldg R ▪ Office 4467
> > 600 Research Drive ▪ Cary, NC 27513
> > Tel: 919 531 1233 ▪ [email protected]<mailto:[email protected]>
> > www.sas.com<http://www.sas.com/>
> > SAS® … THE POWER TO KNOW®
> >
On Fri, Mar 29, 2013 at 11:33 AM, David Jordan <[email protected]> wrote:
>
> Then maybe I don't understand use of domain and range.
>
> :hasSex has a range of :Sex
> I am assigning an :Individual for the range value, which I thought would be 
> flagged as invalid.
>
> Is there another way to do this? I want to do a constraint check that will 
> prevent the hasSex property from being given a value of anything other than a 
> :Sex (or :Male, :Female).

rdfs:[domain,range] state that subjects and objects triples using the
property are members of the declared domains and ranges.
Specifically,

if [P rdfs:domain D] and [X P Y]
then [X rdf:type D]

if [P rdfs:range R] and [X P Y]
then [Y rdf:type R]

In your example, you created individuals p1 and p2, and asserted [p1
hasSex p2] [hasSex rdfs:range Sex] so it can be inferred that [p2
rdf:type Sex].

I expect that what you want is that p2 should not have type Sex, so
define some class, say, Person, that is disjoint from Sex, assert that
p2 is a Person, and then there will be an inconsistency.

//JT
--
Joshua Taylor, http://www.cs.rpi.edu/~tayloj/

Reply via email to