You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@jena.apache.org by David Jordan <Da...@sas.com> on 2013/04/01 17:34:37 UTC

performance of createIndividual with OntModel

I am getting a performance result of around 1 minute clock time to execute OntClass.createIndividual. Is this expected? Below is the relevant part of the ontology and the Java code. Every line of code runs fast except the createIndividual. Is this due to reasoning being kicked off for the first time? I’ll see if adding a second individual is just as slow.

veh:numWheels a   owl:DatatypeProperty ;
      rdfs:domain veh:Vehicle ;
      rdfs:range xsd:integer .

veh:Vehicle
      a       owl:Class ;
      rdfs:subClassOf
              [ a       owl:Restriction ;
                owl:maxCardinality """1
                        """^^xsd:nonNegativeInteger ;
                owl:onProperty veh:numWheels
              ] .

veh:Motorcycle
      a       owl:Class ;
      rdfs:subClassOf veh:Vehicle ;
      owl:equivalentClass
              [ a       owl:Restriction ;
                owl:hasValue "2"^^xsd:nonNegativeInteger ;
                owl:onProperty veh:numWheels
              ] .


Here is the Java code.

Model model = getNamedModel(VEHICLE_MODEL_NAME);
OntModelSpec spec = new OntModelSpec(OntModelSpec.OWL_DL_MEM_RULE_INF);
OntModel omodel = ModelFactory.createOntologyModel(spec, model);
OntClass bikeClass = omodel.getOntClass(uriBase + "Motorcycle");
Individual myBike = bikeClass.createIndividual(uriBase + "data/myBike");

This is with latest SDB and Postgres.
Is there anything in the ontology causing the slowdown?

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 ▪ david.jordan@sas.com<ma...@sas.com>
www.sas.com<http://www.sas.com/>
SAS® … THE POWER TO KNOW®


Re: performance of createIndividual with OntModel

Posted by Joshua TAYLOR <jo...@gmail.com>.
On Mon, Apr 1, 2013 at 1:07 PM, David Jordan <Da...@sas.com> wrote:
>
> Thanks for this input. This is not my code, nor is it how I would have expressed things. I am working with another person, doing a joint Jena eval, this is something he put together. He is out this week, but I am presenting this stuff Wednesday.
>
> I agree that numWheels should just be a functional property. I'll come up with an alternative model that I think is simpler. All he is really wanting to demonstrate is that IF you create a motorcycle, that the property :numWheels will have a value of 2, based on a hasValue constraint on the property. Can this be done without the use of an equivalent class?

Yes, the subclass axiom

Motorcycle subClassOf (value numWheels 2)

will licit the OWL inference

IF x a Motorcyle THEN x a (value numWheels 2),

and from

x a (value numWheels 2)

x numWheels 2 .

The reason I noticed the equivalent class axiom is that often times it
can signify a modeling error, particularly if the domain of the
property at hand has a domain that is more general than the equivalent
class.  That didn't sound all that clear, so here's an example:  given
a property, say, hasNumberOfTeeth that has domain Animal.  We want to
assert that humans have 32 teeth, and that Humans are a subclass of
Animal.  So in defining Human we'd have

Human subClassOf Animal
Human subClassOf (value hasNumberOfTeeth 32)

so if we know that something is a Human, we know it's an animal and
that it has 32 teeth.  However, if we described Human with

Human subClassOf Animal
Human equivalentClass (value hasNumberOfTeeth 32)

then *anything* with 32 teeth is now a Human (since the classes are
equivalent), and that's not right, since, for instance

Giraffe subClassOfAnimal
Giraffe subClassOf (value hasNumberOfTeeth 32)

and Giraffe and Human should be disjoint.

//JT

RE: performance of createIndividual with OntModel

Posted by David Jordan <Da...@sas.com>.
Thanks for this input. This is not my code, nor is it how I would have expressed things. I am working with another person, doing a joint Jena eval, this is something he put together. He is out this week, but I am presenting this stuff Wednesday.

I agree that numWheels should just be a functional property. I'll come up with an alternative model that I think is simpler. All he is really wanting to demonstrate is that IF you create a motorcycle, that the property :numWheels will have a value of 2, based on a hasValue constraint on the property. Can this be done without the use of an equivalent class? 

-----Original Message-----
From: Joshua TAYLOR [mailto:joshuaaaron@gmail.com] 
Sent: Monday, April 01, 2013 12:45 PM
To: users@jena.apache.org
Subject: Re: performance of createIndividual with OntModel

On Mon, Apr 1, 2013 at 11:34 AM, David Jordan <Da...@sas.com> wrote:
>
> I am getting a performance result of around 1 minute clock time to execute OntClass.createIndividual. Is this expected? Below is the relevant part of the ontology and the Java code. Every line of code runs fast except the createIndividual. Is this due to reasoning being kicked off for the first time? I’ll see if adding a second individual is just as slow.
>
> Here is the Java code.
>
> Model model = getNamedModel(VEHICLE_MODEL_NAME);
> OntModelSpec spec = new 
> OntModelSpec(OntModelSpec.OWL_DL_MEM_RULE_INF);
> OntModel omodel = ModelFactory.createOntologyModel(spec, model); 
> OntClass bikeClass = omodel.getOntClass(uriBase + "Motorcycle"); 
> Individual myBike = bikeClass.createIndividual(uriBase + 
> "data/myBike");

I don't see anything strange about this Jena code (but someone else could reply with something I don't know about), but something looks a bit strange about the ontology that you posted. That could, as you suggested, cause some trouble with the reasoner, but I don't know whether it has anything to do with the strange behavior you're seeing.
 If nothing else, these are thing that you could play around with and see whether they change the behavior (in case it is a reasoner issue).

> veh:numWheels a   owl:DatatypeProperty ;
>       rdfs:domain veh:Vehicle ;
>       rdfs:range xsd:integer .
>
> veh:Vehicle
>       a       owl:Class ;
>       rdfs:subClassOf
>               [ a       owl:Restriction ;
>                 owl:maxCardinality """1
>                         """^^xsd:nonNegativeInteger ;
>                 owl:onProperty veh:numWheels
>               ] .

Rather than using a restriction here, you could also just as well say that veh:numWheels is a functional property. This shouldn't make a difference, though, since they'll have the same effect;  I'm just noting it because it's a somewhat simpler construct.


> veh:Motorcycle
>       a       owl:Class ;
>       rdfs:subClassOf veh:Vehicle ;
>       owl:equivalentClass
>               [ a       owl:Restriction ;
>                 owl:hasValue "2"^^xsd:nonNegativeInteger ;
>                 owl:onProperty veh:numWheels
>               ] .

I wonder whether that equivalent class axiom shouldn't be a subclass axiom?  This says that *anything* that has numWheels = 2 is a motorcycle.  Now, anything that has numWheels at all is a Vehicle (based on the domain of numWheels), so there won't be any inconsistency with a non-Vehicle that has 2 wheels, since by virtue of it having wheels, it's a vehicle.  But you'll suddenly find that rickshaws, bicycles, and chariots are now all motorcycles, since they have two wheels.  If you make this a subclass axiom, however, you'll still be able to go from "x is a motorcycle" to "x has two wheels", but not in the other direction.  Equivalent classes can cause some complexity increase, but I don't know whether that leads to the symptoms you're having.

//JT


Re: performance of createIndividual with OntModel

Posted by Joshua TAYLOR <jo...@gmail.com>.
On Mon, Apr 1, 2013 at 1:47 PM, David Jordan <Da...@sas.com> wrote:
> I added the call to prepare().
> I changed the ontology to the following, it did not really make much difference in performance, still very slow.
>
> :numWheels
>       a       owl:FunctionalProperty ;
>       a       owl:DatatypeProperty ;
>       rdfs:domain  :Vehicle ;
>       rdfs:range xsd:integer .
>
> :Motorcycle
>       a       owl:Class ;
>       rdfs:subClassOf  :Vehicle ;
>       a [ a       owl:Restriction ;
>                 owl:hasValue "2"^^xsd:nonNegativeInteger ;
>                 owl:onProperty  :numWheels
>               ] .

The definition of Motorcyle isn't right.  Motorcycle (the class) isn't
something that has numWheels 2.  The class, being a class, and not a
vehicle, shouldn't have any value for numWheels at all.  The model
shouldn't "Motorcycle a [ a owl:Restriction ... ]", but rather
"Motorcycle rdfs:subClassOf [a owl:Restriction ...]".

The Jena reasoners will operate on OWL full where you can say just
about anything, but the model above isn't OWL DL, which is what most
users typically want to stay within.  Using some of the ontology
profile checking tools might be a good test to include somewhere along
the line.  (E.g., Pellet comes with some command line tools for this,
and there are online validators too, e.g.,
http://www.mygrid.org.uk/OWL/Validator ).

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

Re: performance of createIndividual with OntModel

Posted by Dave Reynolds <da...@gmail.com>.
Odd, can't explain that.

As I've mentioned before reasoning over a database backend, especially 
an SDB one, is a really bad idea and will be very slow. But I can't 
explain why a simple createIndividual should take quite so long.

Try with in-memory v. SDB and with/without reasoning to isolate some of 
the effects.

You may need a write-through in-memory cache to get usable performance.

Dave

On 01/04/13 18:47, David Jordan wrote:
> I added the call to prepare().
> I changed the ontology to the following, it did not really make much difference in performance, still very slow.
>
> :numWheels
>        a       owl:FunctionalProperty ;
>        a       owl:DatatypeProperty ;
>        rdfs:domain  :Vehicle ;
>        rdfs:range xsd:integer .
>
> :Motorcycle
>        a       owl:Class ;
>        rdfs:subClassOf  :Vehicle ;
>        a [ a       owl:Restriction ;
>                  owl:hasValue "2"^^xsd:nonNegativeInteger ;
>                  owl:onProperty  :numWheels
>                ] .
>
>
>
> -----Original Message-----
> From: Joshua TAYLOR [mailto:joshuaaaron@gmail.com]
> Sent: Monday, April 01, 2013 12:45 PM
> To: users@jena.apache.org
> Subject: Re: performance of createIndividual with OntModel
>
> On Mon, Apr 1, 2013 at 11:34 AM, David Jordan <Da...@sas.com> wrote:
>>
>> I am getting a performance result of around 1 minute clock time to execute OntClass.createIndividual. Is this expected? Below is the relevant part of the ontology and the Java code. Every line of code runs fast except the createIndividual. Is this due to reasoning being kicked off for the first time? I’ll see if adding a second individual is just as slow.
>>
>> Here is the Java code.
>>
>> Model model = getNamedModel(VEHICLE_MODEL_NAME);
>> OntModelSpec spec = new
>> OntModelSpec(OntModelSpec.OWL_DL_MEM_RULE_INF);
>> OntModel omodel = ModelFactory.createOntologyModel(spec, model);
>> OntClass bikeClass = omodel.getOntClass(uriBase + "Motorcycle");
>> Individual myBike = bikeClass.createIndividual(uriBase +
>> "data/myBike");
>
> I don't see anything strange about this Jena code (but someone else could reply with something I don't know about), but something looks a bit strange about the ontology that you posted. That could, as you suggested, cause some trouble with the reasoner, but I don't know whether it has anything to do with the strange behavior you're seeing.
>   If nothing else, these are thing that you could play around with and see whether they change the behavior (in case it is a reasoner issue).
>
>> veh:numWheels a   owl:DatatypeProperty ;
>>        rdfs:domain veh:Vehicle ;
>>        rdfs:range xsd:integer .
>>
>> veh:Vehicle
>>        a       owl:Class ;
>>        rdfs:subClassOf
>>                [ a       owl:Restriction ;
>>                  owl:maxCardinality """1
>>                          """^^xsd:nonNegativeInteger ;
>>                  owl:onProperty veh:numWheels
>>                ] .
>
> Rather than using a restriction here, you could also just as well say that veh:numWheels is a functional property. This shouldn't make a difference, though, since they'll have the same effect;  I'm just noting it because it's a somewhat simpler construct.
>
>
>> veh:Motorcycle
>>        a       owl:Class ;
>>        rdfs:subClassOf veh:Vehicle ;
>>        owl:equivalentClass
>>                [ a       owl:Restriction ;
>>                  owl:hasValue "2"^^xsd:nonNegativeInteger ;
>>                  owl:onProperty veh:numWheels
>>                ] .
>
> I wonder whether that equivalent class axiom shouldn't be a subclass axiom?  This says that *anything* that has numWheels = 2 is a motorcycle.  Now, anything that has numWheels at all is a Vehicle (based on the domain of numWheels), so there won't be any inconsistency with a non-Vehicle that has 2 wheels, since by virtue of it having wheels, it's a vehicle.  But you'll suddenly find that rickshaws, bicycles, and chariots are now all motorcycles, since they have two wheels.  If you make this a subclass axiom, however, you'll still be able to go from "x is a motorcycle" to "x has two wheels", but not in the other direction.  Equivalent classes can cause some complexity increase, but I don't know whether that leads to the symptoms you're having.
>
> //JT
>


RE: performance of createIndividual with OntModel

Posted by David Jordan <Da...@sas.com>.
I added the call to prepare().
I changed the ontology to the following, it did not really make much difference in performance, still very slow.

:numWheels
      a       owl:FunctionalProperty ;
      a       owl:DatatypeProperty ;
      rdfs:domain  :Vehicle ;
      rdfs:range xsd:integer .

:Motorcycle
      a       owl:Class ;
      rdfs:subClassOf  :Vehicle ;
      a [ a       owl:Restriction ;
                owl:hasValue "2"^^xsd:nonNegativeInteger ;
                owl:onProperty  :numWheels
              ] .



-----Original Message-----
From: Joshua TAYLOR [mailto:joshuaaaron@gmail.com] 
Sent: Monday, April 01, 2013 12:45 PM
To: users@jena.apache.org
Subject: Re: performance of createIndividual with OntModel

On Mon, Apr 1, 2013 at 11:34 AM, David Jordan <Da...@sas.com> wrote:
>
> I am getting a performance result of around 1 minute clock time to execute OntClass.createIndividual. Is this expected? Below is the relevant part of the ontology and the Java code. Every line of code runs fast except the createIndividual. Is this due to reasoning being kicked off for the first time? I’ll see if adding a second individual is just as slow.
>
> Here is the Java code.
>
> Model model = getNamedModel(VEHICLE_MODEL_NAME);
> OntModelSpec spec = new 
> OntModelSpec(OntModelSpec.OWL_DL_MEM_RULE_INF);
> OntModel omodel = ModelFactory.createOntologyModel(spec, model); 
> OntClass bikeClass = omodel.getOntClass(uriBase + "Motorcycle"); 
> Individual myBike = bikeClass.createIndividual(uriBase + 
> "data/myBike");

I don't see anything strange about this Jena code (but someone else could reply with something I don't know about), but something looks a bit strange about the ontology that you posted. That could, as you suggested, cause some trouble with the reasoner, but I don't know whether it has anything to do with the strange behavior you're seeing.
 If nothing else, these are thing that you could play around with and see whether they change the behavior (in case it is a reasoner issue).

> veh:numWheels a   owl:DatatypeProperty ;
>       rdfs:domain veh:Vehicle ;
>       rdfs:range xsd:integer .
>
> veh:Vehicle
>       a       owl:Class ;
>       rdfs:subClassOf
>               [ a       owl:Restriction ;
>                 owl:maxCardinality """1
>                         """^^xsd:nonNegativeInteger ;
>                 owl:onProperty veh:numWheels
>               ] .

Rather than using a restriction here, you could also just as well say that veh:numWheels is a functional property. This shouldn't make a difference, though, since they'll have the same effect;  I'm just noting it because it's a somewhat simpler construct.


> veh:Motorcycle
>       a       owl:Class ;
>       rdfs:subClassOf veh:Vehicle ;
>       owl:equivalentClass
>               [ a       owl:Restriction ;
>                 owl:hasValue "2"^^xsd:nonNegativeInteger ;
>                 owl:onProperty veh:numWheels
>               ] .

I wonder whether that equivalent class axiom shouldn't be a subclass axiom?  This says that *anything* that has numWheels = 2 is a motorcycle.  Now, anything that has numWheels at all is a Vehicle (based on the domain of numWheels), so there won't be any inconsistency with a non-Vehicle that has 2 wheels, since by virtue of it having wheels, it's a vehicle.  But you'll suddenly find that rickshaws, bicycles, and chariots are now all motorcycles, since they have two wheels.  If you make this a subclass axiom, however, you'll still be able to go from "x is a motorcycle" to "x has two wheels", but not in the other direction.  Equivalent classes can cause some complexity increase, but I don't know whether that leads to the symptoms you're having.

//JT


Re: performance of createIndividual with OntModel

Posted by Joshua TAYLOR <jo...@gmail.com>.
On Mon, Apr 1, 2013 at 11:34 AM, David Jordan <Da...@sas.com> wrote:
>
> I am getting a performance result of around 1 minute clock time to execute OntClass.createIndividual. Is this expected? Below is the relevant part of the ontology and the Java code. Every line of code runs fast except the createIndividual. Is this due to reasoning being kicked off for the first time? I’ll see if adding a second individual is just as slow.
>
> Here is the Java code.
>
> Model model = getNamedModel(VEHICLE_MODEL_NAME);
> OntModelSpec spec = new OntModelSpec(OntModelSpec.OWL_DL_MEM_RULE_INF);
> OntModel omodel = ModelFactory.createOntologyModel(spec, model);
> OntClass bikeClass = omodel.getOntClass(uriBase + "Motorcycle");
> Individual myBike = bikeClass.createIndividual(uriBase + "data/myBike");

I don't see anything strange about this Jena code (but someone else
could reply with something I don't know about), but something looks a
bit strange about the ontology that you posted. That could, as you
suggested, cause some trouble with the reasoner, but I don't know
whether it has anything to do with the strange behavior you're seeing.
 If nothing else, these are thing that you could play around with and
see whether they change the behavior (in case it is a reasoner issue).

> veh:numWheels a   owl:DatatypeProperty ;
>       rdfs:domain veh:Vehicle ;
>       rdfs:range xsd:integer .
>
> veh:Vehicle
>       a       owl:Class ;
>       rdfs:subClassOf
>               [ a       owl:Restriction ;
>                 owl:maxCardinality """1
>                         """^^xsd:nonNegativeInteger ;
>                 owl:onProperty veh:numWheels
>               ] .

Rather than using a restriction here, you could also just as well say
that veh:numWheels is a functional property. This shouldn't make a
difference, though, since they'll have the same effect;  I'm just
noting it because it's a somewhat simpler construct.

> veh:Motorcycle
>       a       owl:Class ;
>       rdfs:subClassOf veh:Vehicle ;
>       owl:equivalentClass
>               [ a       owl:Restriction ;
>                 owl:hasValue "2"^^xsd:nonNegativeInteger ;
>                 owl:onProperty veh:numWheels
>               ] .

I wonder whether that equivalent class axiom shouldn't be a subclass
axiom?  This says that *anything* that has numWheels = 2 is a
motorcycle.  Now, anything that has numWheels at all is a Vehicle
(based on the domain of numWheels), so there won't be any
inconsistency with a non-Vehicle that has 2 wheels, since by virtue of
it having wheels, it's a vehicle.  But you'll suddenly find that
rickshaws, bicycles, and chariots are now all motorcycles, since they
have two wheels.  If you make this a subclass axiom, however, you'll
still be able to go from "x is a motorcycle" to "x has two wheels",
but not in the other direction.  Equivalent classes can cause some
complexity increase, but I don't know whether that leads to the
symptoms you're having.

//JT

RE: performance of createIndividual with OntModel

Posted by David Jordan <Da...@sas.com>.
Timing was accurate, I was statement stepping in the Eclipse debugger. But adding the prepare will isolate where the overhead is occurring.


-----Original Message-----
From: Rob Vesse [mailto:rvesse@yarcdata.com] 
Sent: Monday, April 01, 2013 12:45 PM
To: users@jena.apache.org
Subject: Re: performance of createIndividual with OntModel

It is entirely possible that your timing is inaccurate because you have not accounted for the preparation time of the OntModel


An OntModel does not do any reasoning until it has to, the first thing that triggers reasoning can make what might be a normally fast operation appear very slow.  This is particularly true when your OntModel is over a SDB backed model since this may result in many small database calls.

After you create your OntModel call prepare() on it and time this separately from your createIndividual() or other calls.

Hope this helps,

Rob


On 4/1/13 8:34 AM, "David Jordan" <Da...@sas.com> wrote:

>
>I am getting a performance result of around 1 minute clock time to 
>execute OntClass.createIndividual. Is this expected? Below is the 
>relevant part of the ontology and the Java code. Every line of code 
>runs fast except the createIndividual. Is this due to reasoning being 
>kicked off for the first time? I’ll see if adding a second individual 
>is just as slow.
>
>veh:numWheels a   owl:DatatypeProperty ;
>      rdfs:domain veh:Vehicle ;
>      rdfs:range xsd:integer .
>
>veh:Vehicle
>      a       owl:Class ;
>      rdfs:subClassOf
>              [ a       owl:Restriction ;
>                owl:maxCardinality """1
>                        """^^xsd:nonNegativeInteger ;
>                owl:onProperty veh:numWheels
>              ] .
>
>veh:Motorcycle
>      a       owl:Class ;
>      rdfs:subClassOf veh:Vehicle ;
>      owl:equivalentClass
>              [ a       owl:Restriction ;
>                owl:hasValue "2"^^xsd:nonNegativeInteger ;
>                owl:onProperty veh:numWheels
>              ] .
>
>
>Here is the Java code.
>
>Model model = getNamedModel(VEHICLE_MODEL_NAME);
>OntModelSpec spec = new OntModelSpec(OntModelSpec.OWL_DL_MEM_RULE_INF);
>OntModel omodel = ModelFactory.createOntologyModel(spec, model); 
>OntClass bikeClass = omodel.getOntClass(uriBase + "Motorcycle"); 
>Individual myBike = bikeClass.createIndividual(uriBase + 
>"data/myBike");
>
>This is with latest SDB and Postgres.
>Is there anything in the ontology causing the slowdown?
>
>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 ▪ david.jordan@sas.com<ma...@sas.com>
>www.sas.com<http://www.sas.com/>
>SAS® … THE POWER TO KNOW®
>


Re: performance of createIndividual with OntModel

Posted by Rob Vesse <rv...@yarcdata.com>.
It is entirely possible that your timing is inaccurate because you have
not accounted for the preparation time of the OntModel


An OntModel does not do any reasoning until it has to, the first thing
that triggers reasoning can make what might be a normally fast operation
appear very slow.  This is particularly true when your OntModel is over a
SDB backed model since this may result in many small database calls.

After you create your OntModel call prepare() on it and time this
separately from your createIndividual() or other calls.

Hope this helps,

Rob


On 4/1/13 8:34 AM, "David Jordan" <Da...@sas.com> wrote:

>
>I am getting a performance result of around 1 minute clock time to
>execute OntClass.createIndividual. Is this expected? Below is the
>relevant part of the ontology and the Java code. Every line of code runs
>fast except the createIndividual. Is this due to reasoning being kicked
>off for the first time? I’ll see if adding a second individual is just as
>slow.
>
>veh:numWheels a   owl:DatatypeProperty ;
>      rdfs:domain veh:Vehicle ;
>      rdfs:range xsd:integer .
>
>veh:Vehicle
>      a       owl:Class ;
>      rdfs:subClassOf
>              [ a       owl:Restriction ;
>                owl:maxCardinality """1
>                        """^^xsd:nonNegativeInteger ;
>                owl:onProperty veh:numWheels
>              ] .
>
>veh:Motorcycle
>      a       owl:Class ;
>      rdfs:subClassOf veh:Vehicle ;
>      owl:equivalentClass
>              [ a       owl:Restriction ;
>                owl:hasValue "2"^^xsd:nonNegativeInteger ;
>                owl:onProperty veh:numWheels
>              ] .
>
>
>Here is the Java code.
>
>Model model = getNamedModel(VEHICLE_MODEL_NAME);
>OntModelSpec spec = new OntModelSpec(OntModelSpec.OWL_DL_MEM_RULE_INF);
>OntModel omodel = ModelFactory.createOntologyModel(spec, model);
>OntClass bikeClass = omodel.getOntClass(uriBase + "Motorcycle");
>Individual myBike = bikeClass.createIndividual(uriBase + "data/myBike");
>
>This is with latest SDB and Postgres.
>Is there anything in the ontology causing the slowdown?
>
>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 ▪ david.jordan@sas.com<ma...@sas.com>
>www.sas.com<http://www.sas.com/>
>SAS® … THE POWER TO KNOW®
>