Bug in Protege to Java: Duplicated function definitions will be generated

View: New views
20 Messages — Rating Filter:   Alert me  
< Prev | 1 - 2 | Next >

Bug in Protege to Java: Duplicated function definitions will be generated

by Wing Kuen LEE :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Hi,

This is a bug in both Protege 3.3.1 and Protege 3.4 beta when generating
Protege-OWL Java Code.

Some generated Java classes (those "impl/*_.java") will have duplicated
function definitions. That is, it will generate two functions with the
same name, the same parameter list, and the same return values for the
same class. Some of those duplicated function definitions are:

   public Collection getPartOfEnumeratedClass()
   public RDFProperty getPartOfEnumeratedClassProperty()
   public boolean hasPartOfEnumeratedClass()
   public Iterator listPartOfEnumeratedClass()
   public void addPartOfEnumeratedClass(Object newPartOfEnumeratedClass)
   public void removePartOfEnumeratedClass(Object oldPartOfEnumeratedClass)
   public void setPartOfEnumeratedClass(Collection
newPartOfEnumeratedClass)

I try the same project with Protege 3.1.1. It has no such error.

No workaround is found, exactly remove the duplicated definition
manually. But it is cumbersome to remove duplicated functions when
number of classes are large.

Regards,


Ken

_______________________________________________
protege-owl mailing list
protege-owl@...
https://mailman.stanford.edu/mailman/listinfo/protege-owl

Instructions for unsubscribing: http://protege.stanford.edu/doc/faq.html#01a.03 

Re: Bug in Protege to Java: Duplicated function definitions will be generated

by Kormann, Joseph :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Ken,

We have the same problem and it appears when you import two Ontologies
with either the same Class or Property name. Example: OntA.Class1 and
OntB.Class1 are included into OntC. RDF/OWL-wise they are separated by
namespaces. When the Java code is created, the namespace is removed and
you get the collision.

The best solution would be to sub-class or sub-package, so OntA would be
a Java Package with Class1 and OntB would be a Java Package with a
Class1, leaving OntC to inherit correctly. They tried to work around it
with a switch to prefix the Classes and Properties, however it's kludgy
and not elegant. (Sorry Csognor.)

> -----Original Message-----
> From: protege-owl-bounces@... [mailto:protege-owl-
> bounces@...] On Behalf Of Wing Kuen LEE
> Sent: Tuesday, July 22, 2008 4:07 AM
> To: protege-owl@...
> Subject: [protege-owl] Bug in Protege to Java: Duplicated function
> definitions will be generated
>
> Hi,
>
> This is a bug in both Protege 3.3.1 and Protege 3.4 beta when
generating
> Protege-OWL Java Code.
>
> Some generated Java classes (those "impl/*_.java") will have
duplicated
> function definitions. That is, it will generate two functions with the
> same name, the same parameter list, and the same return values for the
> same class. Some of those duplicated function definitions are:
>
>    public Collection getPartOfEnumeratedClass()
>    public RDFProperty getPartOfEnumeratedClassProperty()
>    public boolean hasPartOfEnumeratedClass()
>    public Iterator listPartOfEnumeratedClass()
>    public void addPartOfEnumeratedClass(Object
newPartOfEnumeratedClass)

>    public void removePartOfEnumeratedClass(Object
> oldPartOfEnumeratedClass)
>    public void setPartOfEnumeratedClass(Collection
> newPartOfEnumeratedClass)
>
> I try the same project with Protege 3.1.1. It has no such error.
>
> No workaround is found, exactly remove the duplicated definition
> manually. But it is cumbersome to remove duplicated functions when
> number of classes are large.
>
> Regards,
>
>
> Ken
>
> _______________________________________________
> protege-owl mailing list
> protege-owl@...
> https://mailman.stanford.edu/mailman/listinfo/protege-owl
>
> Instructions for unsubscribing:
> http://protege.stanford.edu/doc/faq.html#01a.03
_______________________________________________
protege-owl mailing list
protege-owl@...
https://mailman.stanford.edu/mailman/listinfo/protege-owl

Instructions for unsubscribing: http://protege.stanford.edu/doc/faq.html#01a.03 

Re: Bug in Protege to Java: Duplicated function definitions will be generated

by Kormann, Joseph :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Here's some OWL files as an example. OntAB depends on OntA and OntB.

The MyFactory.java is what comes from Protégé 3.4b120. The UpdatedMyFactory.java is one example of how I think the generated Java code could be generated and address Ken's and my concerns.

> -----Original Message-----
> From: protege-owl-bounces@... [mailto:protege-owl-
> bounces@...] On Behalf Of Wing Kuen LEE
> Sent: Tuesday, July 22, 2008 4:07 AM
> To: protege-owl@...
> Subject: [protege-owl] Bug in Protege to Java: Duplicated function
> definitions will be generated
>
> Hi,
>
> This is a bug in both Protege 3.3.1 and Protege 3.4 beta when generating
> Protege-OWL Java Code.
>
> Some generated Java classes (those "impl/*_.java") will have duplicated
> function definitions. That is, it will generate two functions with the
> same name, the same parameter list, and the same return values for the
> same class. Some of those duplicated function definitions are:
>
>    public Collection getPartOfEnumeratedClass()
>    public RDFProperty getPartOfEnumeratedClassProperty()
>    public boolean hasPartOfEnumeratedClass()
>    public Iterator listPartOfEnumeratedClass()
>    public void addPartOfEnumeratedClass(Object newPartOfEnumeratedClass)
>    public void removePartOfEnumeratedClass(Object
> oldPartOfEnumeratedClass)
>    public void setPartOfEnumeratedClass(Collection
> newPartOfEnumeratedClass)
>
> I try the same project with Protege 3.1.1. It has no such error.
>
> No workaround is found, exactly remove the duplicated definition
> manually. But it is cumbersome to remove duplicated functions when
> number of classes are large.
>
> Regards,
>
>
> Ken
>
> _______________________________________________
> protege-owl mailing list
> protege-owl@...
> https://mailman.stanford.edu/mailman/listinfo/protege-owl
>
> Instructions for unsubscribing:
> http://protege.stanford.edu/doc/faq.html#01a.03






_______________________________________________
protege-owl mailing list
protege-owl@...
https://mailman.stanford.edu/mailman/listinfo/protege-owl

Instructions for unsubscribing: http://protege.stanford.edu/doc/faq.html#01a.03 

OntA.owl (1K) Download Attachment
OntAB.owl (1K) Download Attachment
OntB.owl (1K) Download Attachment
MyFactory.java (9K) Download Attachment
UpdatedMyFactory.java (10K) Download Attachment

Re: Bug in Protege to Java: Duplicated function definitions will be generated

by Csongor Nyulas :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Ken,

Do you have the multiple import situation Joseph has described? If not,
can you send us the (part of) ontology
that is creating the problem.
If you do have the situation described by Joseph, you can use the
solution proposed by him, or the
direct solution he mentioned:
a relatively new option (last check box in Protege 3.4's code generation
dialog box) to
include the namespace prefixes in the generated Java name of classes and
properties.
This is not an elegant solution, indeed, but it can be very useful.
We have implemented this solution on user's demand and because
implementing the more correct solution
of generating Java packages was not a trivial fix, and we did not have
the resources for that.
If anybody would like to improve the code generation in this regard he
or she is welcome to help us out.

Csongor

Kormann, Joseph wrote:

> Ken,
>
> We have the same problem and it appears when you import two Ontologies
> with either the same Class or Property name. Example: OntA.Class1 and
> OntB.Class1 are included into OntC. RDF/OWL-wise they are separated by
> namespaces. When the Java code is created, the namespace is removed and
> you get the collision.
>
> The best solution would be to sub-class or sub-package, so OntA would be
> a Java Package with Class1 and OntB would be a Java Package with a
> Class1, leaving OntC to inherit correctly. They tried to work around it
> with a switch to prefix the Classes and Properties, however it's kludgy
> and not elegant. (Sorry Csognor.)
>
>  
>> -----Original Message-----
>> From: protege-owl-bounces@... [mailto:protege-owl-
>> bounces@...] On Behalf Of Wing Kuen LEE
>> Sent: Tuesday, July 22, 2008 4:07 AM
>> To: protege-owl@...
>> Subject: [protege-owl] Bug in Protege to Java: Duplicated function
>> definitions will be generated
>>
>> Hi,
>>
>> This is a bug in both Protege 3.3.1 and Protege 3.4 beta when
>>    
> generating
>  
>> Protege-OWL Java Code.
>>
>> Some generated Java classes (those "impl/*_.java") will have
>>    
> duplicated
>  
>> function definitions. That is, it will generate two functions with the
>> same name, the same parameter list, and the same return values for the
>> same class. Some of those duplicated function definitions are:
>>
>>    public Collection getPartOfEnumeratedClass()
>>    public RDFProperty getPartOfEnumeratedClassProperty()
>>    public boolean hasPartOfEnumeratedClass()
>>    public Iterator listPartOfEnumeratedClass()
>>    public void addPartOfEnumeratedClass(Object
>>    
> newPartOfEnumeratedClass)
>  
>>    public void removePartOfEnumeratedClass(Object
>> oldPartOfEnumeratedClass)
>>    public void setPartOfEnumeratedClass(Collection
>> newPartOfEnumeratedClass)
>>
>> I try the same project with Protege 3.1.1. It has no such error.
>>
>> No workaround is found, exactly remove the duplicated definition
>> manually. But it is cumbersome to remove duplicated functions when
>> number of classes are large.
>>
>> Regards,
>>
>>
>> Ken
>>
>> _______________________________________________
>> protege-owl mailing list
>> protege-owl@...
>> https://mailman.stanford.edu/mailman/listinfo/protege-owl
>>
>> Instructions for unsubscribing:
>> http://protege.stanford.edu/doc/faq.html#01a.03
>>    
> _______________________________________________
> protege-owl mailing list
> protege-owl@...
> https://mailman.stanford.edu/mailman/listinfo/protege-owl
>
> Instructions for unsubscribing: http://protege.stanford.edu/doc/faq.html#01a.03 
>  


_______________________________________________
protege-owl mailing list
protege-owl@...
https://mailman.stanford.edu/mailman/listinfo/protege-owl

Instructions for unsubscribing: http://protege.stanford.edu/doc/faq.html#01a.03 

Import ontologies from databases using datamaster

by Riccardo.Grosso :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Dear All,

I've some problems importing ontologies from databases using datamaster.

I've some big table, with large size, that I can import, for memory problem of protege, also incrementing lax parameters.

It is possible, when connecting to databases, to import only a part of a table, for examples using a filter on a value of an attribute, or like a where condition ?

Thanks and best regards.

Riccardo Grosso

CSI-Piemonte - Direzione Banche Dati, Cultura e Atenei / Cataloghi, Banche Dati, Cultura e Turismo
C.so Unione Sovietica 216 - 10134 TORINO

e-mail: riccardo.grosso@...
skype: riccardo.grosso
http://www.csipiemonte.it

___________________________________________________________
Il presente messaggio, corredato degli eventuali allegati, contiene informazioni da considerarsi strettamente riservate e confidenziali.
Ne è vietato l'uso improprio, la diffusione, la distribuzione o la riproduzione da parte di altre persone e/o entità diverse da quelle specificate.
Qualora lo abbiate ricevuto per errore, vi preghiamo di distruggere il messaggio, comunicando l'errata ricezione tramite il reply all'indirizzo mittente.

_______________________________________________
protege-owl mailing list
protege-owl@...
https://mailman.stanford.edu/mailman/listinfo/protege-owl

Instructions for unsubscribing: http://protege.stanford.edu/doc/faq.html#01a.03 

Re: Import ontologies from databases using datamaster

by Csongor Nyulas :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Dear Riccardo,

This is not possible, and it we are not planning to change DataMaster to
offer such an option. I wanted to recommend to you to use a database
back-end for Protege, to store your ontology (that is getting very big
by importing many instances) in a database instead of a file. This is a
good advise, which you could definitely follow, but I realized
afterwards, that maybe this won't solve your problem, because DataMaster
itself will try to get the whole table (though only one at a time) in
the memory when importing the rows of a table as instances in the
ontology. I could change that behavior, to fetch one row at a time, but
it will slow down DataMaster considerably. I am not sure what would be
the best solution.

BTW, I hope you are using the DataMaster v1.3 or later (for example
1.3.1) which is bundled with the Protege 3.4 beta starting with Build
500 and has some important performance improvements. For more
information check out the change logs:
http://protegewiki.stanford.edu/index.php/DataMaster_1.3
http://protegewiki.stanford.edu/index.php/DataMaster_1.3.1

Csongor


Riccardo.Grosso@... wrote:

> Dear All,
>
> I've some problems importing ontologies from databases using datamaster.
>
> I've some big table, with large size, that I can import, for memory
> problem of protege, also incrementing lax parameters.
>
> It is possible, when connecting to databases, to import only a part of
> a table, for examples using a filter on a value of an attribute, or
> like a where condition ?
>
> Thanks and best regards.
>
> Riccardo Grosso
>
> CSI-Piemonte - Direzione Banche Dati, Cultura e Atenei / Cataloghi, Banche Dati, Cultura e Turismo
> C.so Unione Sovietica 216 - 10134 TORINO
>
> e-mail: riccardo.grosso@... <mailto:riccardo.grosso@...>
> skype: riccardo.grosso
> http://www.csipiemonte.it
>
> ___________________________________________________________
> Il presente messaggio, corredato degli eventuali allegati, contiene informazioni da considerarsi strettamente riservate e confidenziali.
> Ne è vietato l'uso improprio, la diffusione, la distribuzione o la riproduzione da parte di altre persone e/o entità diverse da quelle specificate.
> Qualora lo abbiate ricevuto per errore, vi preghiamo di distruggere il messaggio, comunicando l'errata ricezione tramite il reply all'indirizzo mittente.
> ------------------------------------------------------------------------
>
> _______________________________________________
> protege-owl mailing list
> protege-owl@...
> https://mailman.stanford.edu/mailman/listinfo/protege-owl
>
> Instructions for unsubscribing: http://protege.stanford.edu/doc/faq.html#01a.03 
>  


_______________________________________________
protege-owl mailing list
protege-owl@...
https://mailman.stanford.edu/mailman/listinfo/protege-owl

Instructions for unsubscribing: http://protege.stanford.edu/doc/faq.html#01a.03 

Parent Message unknown Re: Bug in Protege to Java: Duplicated function definitions will be generated

by Wing Kuen LEE :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Hi Csongor,

I guess I don't have multiple import. So the workaround does not apply
to my case.

I have trimmed down my ontology a bit to the point that it still causes
the duplicated function errors. Because my ontology is large (for human,
at least), I am unable to find the smallest set that still causes the
problem.

It seems that, the classes that have several immediate parents may have
duplicated functions. But I'm not sure about that.

Meanwhile I will use 3.1 to generate Java code. It's okay for my purpose
so far.

Thanks,


Ken


Csongor Nyulas <csongor.nyulas <at> stanford.edu> writes:

 >
 > Ken,
 >
 > Do you have the multiple import situation Joseph has described? If not,
 > can you send us the (part of) ontology
 > that is creating the problem.
 > If you do have the situation described by Joseph, you can use the
 > solution proposed by him, or the
 > direct solution he mentioned:
 > a relatively new option (last check box in Protege 3.4's code generation
 > dialog box) to
 > include the namespace prefixes in the generated Java name of classes and
 > properties.
 > This is not an elegant solution, indeed, but it can be very useful.
 > We have implemented this solution on user's demand and because
 > implementing the more correct solution
 > of generating Java packages was not a trivial fix, and we did not have
 > the resources for that.
 > If anybody would like to improve the code generation in this regard he
 > or she is welcome to help us out.
 >
 > Csongor





<?xml version="1.0"?>
<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:p1="http://protege.stanford.edu/plugins/owl/protege#"
    xmlns:owl="http://www.w3.org/2002/07/owl#"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
    xmlns="http://www.cityu.edu.hk/is/satool.owl#"
    xmlns:daml="http://www.daml.org/2001/03/daml+oil#"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
  xml:base="http://www.cityu.edu.hk/is/satool.owl">
  <owl:Ontology rdf:about=""/>
  <owl:Class rdf:ID="Relationship">
    <owl:disjointWith>
      <owl:Class rdf:ID="Classifier"/>
    </owl:disjointWith>
    <owl:disjointWith>
      <owl:Class rdf:ID="RelationshipEnd"/>
    </owl:disjointWith>
    <owl:equivalentClass>
      <owl:Class>
        <owl:unionOf rdf:parseType="Collection">
          <owl:Class rdf:ID="DirectedRelationship"/>
          <owl:Class rdf:ID="Aggregation"/>
          <owl:Class rdf:ID="Composition"/>
          <owl:Class rdf:ID="Association"/>
        </owl:unionOf>
      </owl:Class>
    </owl:equivalentClass>
    <rdfs:subClassOf>
      <owl:Class rdf:ID="UMLNamedElement"/>
    </rdfs:subClassOf>
  </owl:Class>
  <owl:Class rdf:about="#RelationshipEnd">
    <rdfs:subClassOf>
      <owl:Restriction>
        <owl:onProperty>
          <owl:FunctionalProperty rdf:ID="hasAggregationKind"/>
        </owl:onProperty>
        <owl:cardinality rdf:datatype="http://www.w3.org/2001/XMLSchema#int"
        >1</owl:cardinality>
      </owl:Restriction>
    </rdfs:subClassOf>
    <rdfs:subClassOf>
      <owl:Restriction>
        <owl:maxCardinality rdf:datatype="http://www.w3.org/2001/XMLSchema#int"
        >1</owl:maxCardinality>
        <owl:onProperty>
          <owl:SymmetricProperty rdf:ID="isOppositeTo"/>
        </owl:onProperty>
      </owl:Restriction>
    </rdfs:subClassOf>
    <rdfs:subClassOf>
      <owl:Restriction>
        <owl:onProperty>
          <owl:FunctionalProperty rdf:ID="hasMultiplicity"/>
        </owl:onProperty>
        <owl:cardinality rdf:datatype="http://www.w3.org/2001/XMLSchema#int"
        >1</owl:cardinality>
      </owl:Restriction>
    </rdfs:subClassOf>
    <owl:disjointWith>
      <owl:Class rdf:about="#Classifier"/>
    </owl:disjointWith>
    <rdfs:subClassOf>
      <owl:Class rdf:about="#UMLNamedElement"/>
    </rdfs:subClassOf>
    <owl:disjointWith rdf:resource="#Relationship"/>
    <rdfs:subClassOf>
      <owl:Restriction>
        <owl:onProperty>
          <owl:FunctionalProperty rdf:ID="hasClassifier"/>
        </owl:onProperty>
        <owl:cardinality rdf:datatype="http://www.w3.org/2001/XMLSchema#int"
        >1</owl:cardinality>
      </owl:Restriction>
    </rdfs:subClassOf>
    <owl:equivalentClass>
      <owl:Class>
        <owl:unionOf rdf:parseType="Collection">
          <owl:Class rdf:ID="AggregationEnd"/>
          <owl:Class rdf:ID="AssociationEnd"/>
          <owl:Class rdf:ID="CompositionEnd"/>
          <owl:Class rdf:ID="RelationshipEnd_IncompatibleMultiplicity"/>
          <owl:Class rdf:ID="RelationshipEnd_IncompatibleAggregationKind"/>
        </owl:unionOf>
      </owl:Class>
    </owl:equivalentClass>
    <rdfs:subClassOf>
      <owl:Restriction>
        <owl:cardinality rdf:datatype="http://www.w3.org/2001/XMLSchema#int"
        >1</owl:cardinality>
        <owl:onProperty>
          <owl:FunctionalProperty rdf:ID="hasRelationship"/>
        </owl:onProperty>
      </owl:Restriction>
    </rdfs:subClassOf>
  </owl:Class>
  <owl:Class rdf:ID="ImplicitOperation">
    <owl:equivalentClass>
      <owl:Class>
        <owl:intersectionOf rdf:parseType="Collection">
          <owl:Restriction>
            <owl:onProperty>
              <owl:FunctionalProperty rdf:ID="isImplicitOperation"/>
            </owl:onProperty>
            <owl:hasValue rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean"
            >true</owl:hasValue>
          </owl:Restriction>
          <owl:Class rdf:ID="Operation"/>
        </owl:intersectionOf>
      </owl:Class>
    </owl:equivalentClass>
    <rdfs:subClassOf>
      <owl:Class rdf:ID="NamingConvention"/>
    </rdfs:subClassOf>
  </owl:Class>
  <owl:Class rdf:ID="SString">
    <owl:disjointWith>
      <owl:Class rdf:ID="UML"/>
    </owl:disjointWith>
    <owl:disjointWith>
      <owl:Class rdf:ID="GraphElement"/>
    </owl:disjointWith>
    <owl:disjointWith>
      <owl:Class rdf:ID="ValuePartition"/>
    </owl:disjointWith>
    <rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string"
    >Asserted instancs are names such as class names, attribute names, operation names will all be represented as strings in the ontology. It is expected that this class has only asserted instances, while its subclass has only inferred instances.</rdfs:comment>
  </owl:Class>
  <owl:Class rdf:ID="RedundantSubclass">
    <rdfs:subClassOf>
      <owl:Class rdf:ID="StructureConvention"/>
    </rdfs:subClassOf>
    <owl:equivalentClass>
      <owl:Class>
        <owl:intersectionOf rdf:parseType="Collection">
          <owl:Restriction>
            <owl:onProperty>
              <owl:ObjectProperty rdf:ID="hasSuperClass"/>
            </owl:onProperty>
            <owl:minCardinality rdf:datatype="http://www.w3.org/2001/XMLSchema#int"
            >1</owl:minCardinality>
          </owl:Restriction>
          <owl:Restriction>
            <owl:cardinality rdf:datatype="http://www.w3.org/2001/XMLSchema#int"
            >0</owl:cardinality>
            <owl:onProperty>
              <owl:ObjectProperty rdf:ID="hasAttribute"/>
            </owl:onProperty>
          </owl:Restriction>
          <owl:Restriction>
            <owl:onProperty>
              <owl:ObjectProperty rdf:ID="hasOperation"/>
            </owl:onProperty>
            <owl:cardinality rdf:datatype="http://www.w3.org/2001/XMLSchema#int"
            >0</owl:cardinality>
          </owl:Restriction>
          <owl:Restriction>
            <owl:onProperty>
              <owl:InverseFunctionalProperty rdf:ID="hasRelationshipEnd"/>
            </owl:onProperty>
            <owl:cardinality rdf:datatype="http://www.w3.org/2001/XMLSchema#int"
            >0</owl:cardinality>
          </owl:Restriction>
          <owl:Class rdf:ID="UMLClass"/>
        </owl:intersectionOf>
      </owl:Class>
    </owl:equivalentClass>
  </owl:Class>
  <owl:Class rdf:ID="OperationName">
    <rdfs:subClassOf rdf:resource="#SString"/>
    <owl:equivalentClass>
      <owl:Restriction>
        <owl:someValuesFrom>
          <owl:Class rdf:about="#Operation"/>
        </owl:someValuesFrom>
        <owl:onProperty>
          <owl:InverseFunctionalProperty rdf:ID="isNameOf"/>
        </owl:onProperty>
      </owl:Restriction>
    </owl:equivalentClass>
  </owl:Class>
  <owl:Class rdf:about="#UML">
    <rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string"
    >Asserted instances of its subclasses represent UML elements to reflect the UML model being analyzed.
XUMLElement was removed on 2006/04/25</rdfs:comment>
    <owl:disjointWith>
      <owl:Class rdf:about="#ValuePartition"/>
    </owl:disjointWith>
    <owl:disjointWith>
      <owl:Class rdf:about="#GraphElement"/>
    </owl:disjointWith>
    <owl:disjointWith rdf:resource="#SString"/>
  </owl:Class>
  <owl:Class rdf:ID="BadAssociationName_TooCommon">
    <rdfs:subClassOf>
      <owl:Class rdf:ID="BadAssociationName"/>
    </rdfs:subClassOf>
    <owl:equivalentClass>
      <owl:Class>
        <owl:intersectionOf rdf:parseType="Collection">
          <owl:Class rdf:ID="AssociationName"/>
          <owl:Class rdf:ID="NonEmptyString"/>
          <owl:Class>
            <owl:unionOf rdf:parseType="Collection">
              <owl:Restriction>
                <owl:hasValue rdf:datatype="http://www.w3.org/2001/XMLSchema#string"
                >has</owl:hasValue>
                <owl:onProperty>
                  <owl:FunctionalProperty rdf:ID="text"/>
                </owl:onProperty>
              </owl:Restriction>
              <owl:Restriction>
                <owl:hasValue rdf:datatype="http://www.w3.org/2001/XMLSchema#string"
                >have</owl:hasValue>
                <owl:onProperty>
                  <owl:FunctionalProperty rdf:about="#text"/>
                </owl:onProperty>
              </owl:Restriction>
              <owl:Restriction>
                <owl:onProperty>
                  <owl:FunctionalProperty rdf:about="#text"/>
                </owl:onProperty>
                <owl:hasValue rdf:datatype="http://www.w3.org/2001/XMLSchema#string"
                >had</owl:hasValue>
              </owl:Restriction>
              <owl:Restriction>
                <owl:hasValue rdf:datatype="http://www.w3.org/2001/XMLSchema#string"
                >is</owl:hasValue>
                <owl:onProperty>
                  <owl:FunctionalProperty rdf:about="#text"/>
                </owl:onProperty>
              </owl:Restriction>
              <owl:Restriction>
                <owl:hasValue rdf:datatype="http://www.w3.org/2001/XMLSchema#string"
                >are</owl:hasValue>
                <owl:onProperty>
                  <owl:FunctionalProperty rdf:about="#text"/>
                </owl:onProperty>
              </owl:Restriction>
              <owl:Restriction>
                <owl:onProperty>
                  <owl:FunctionalProperty rdf:about="#text"/>
                </owl:onProperty>
                <owl:hasValue rdf:datatype="http://www.w3.org/2001/XMLSchema#string"
                >was</owl:hasValue>
              </owl:Restriction>
              <owl:Restriction>
                <owl:hasValue rdf:datatype="http://www.w3.org/2001/XMLSchema#string"
                >were</owl:hasValue>
                <owl:onProperty>
                  <owl:FunctionalProperty rdf:about="#text"/>
                </owl:onProperty>
              </owl:Restriction>
              <owl:Restriction>
                <owl:onProperty>
                  <owl:FunctionalProperty rdf:about="#text"/>
                </owl:onProperty>
                <owl:hasValue rdf:datatype="http://www.w3.org/2001/XMLSchema#string"
                >be</owl:hasValue>
              </owl:Restriction>
            </owl:unionOf>
          </owl:Class>
        </owl:intersectionOf>
      </owl:Class>
    </owl:equivalentClass>
  </owl:Class>
  <owl:Class rdf:ID="ClassNamingConvention">
    <rdfs:subClassOf>
      <owl:Class rdf:about="#NamingConvention"/>
    </rdfs:subClassOf>
  </owl:Class>
  <owl:Class rdf:ID="Axiom_1">
    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#Restriction"/>
    <owl:equivalentClass>
      <owl:Restriction>
        <owl:someValuesFrom>
          <owl:Class rdf:about="#Association"/>
        </owl:someValuesFrom>
        <owl:onProperty>
          <owl:FunctionalProperty rdf:about="#hasRelationship"/>
        </owl:onProperty>
      </owl:Restriction>
    </owl:equivalentClass>
  </owl:Class>
  <owl:Class rdf:about="#Composition">
    <owl:equivalentClass>
      <owl:Class>
        <owl:unionOf rdf:parseType="Collection">
          <owl:Class rdf:ID="CompositionL"/>
          <owl:Class rdf:ID="CompositionR"/>
        </owl:unionOf>
      </owl:Class>
    </owl:equivalentClass>
    <rdfs:subClassOf rdf:resource="#Relationship"/>
    <owl:disjointWith>
      <owl:Class rdf:about="#Association"/>
    </owl:disjointWith>
    <owl:disjointWith>
      <owl:Class rdf:about="#Aggregation"/>
    </owl:disjointWith>
    <owl:disjointWith>
      <owl:Class rdf:about="#DirectedRelationship"/>
    </owl:disjointWith>
  </owl:Class>
  <owl:Class rdf:ID="AggregationEnd_1m">
    <owl:equivalentClass>
      <owl:Class>
        <owl:intersectionOf rdf:parseType="Collection">
          <owl:Restriction>
            <owl:onProperty>
              <owl:FunctionalProperty rdf:about="#hasAggregationKind"/>
            </owl:onProperty>
            <owl:hasValue>
              <AggregationKind rdf:ID="shared"/>
            </owl:hasValue>
          </owl:Restriction>
          <owl:Class rdf:about="#AggregationEnd"/>
          <owl:Restriction>
            <owl:hasValue>
              <MultiplicityElement rdf:ID="multiplicity_1m">
                <upperValue rdf:datatype="http://www.w3.org/2001/XMLSchema#int"
                >-1</upperValue>
                <lowerValue rdf:datatype="http://www.w3.org/2001/XMLSchema#int"
                >1</lowerValue>
              </MultiplicityElement>
            </owl:hasValue>
            <owl:onProperty>
              <owl:FunctionalProperty rdf:about="#hasMultiplicity"/>
            </owl:onProperty>
          </owl:Restriction>
        </owl:intersectionOf>
      </owl:Class>
    </owl:equivalentClass>
  </owl:Class>
  <owl:Class rdf:ID="MultipleInheritance">
    <rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string"
    >One of Class Structure Convention</rdfs:comment>
    <owl:equivalentClass>
      <owl:Class>
        <owl:intersectionOf rdf:parseType="Collection">
          <owl:Class rdf:about="#UMLClass"/>
          <owl:Restriction>
            <owl:onProperty>
              <owl:ObjectProperty rdf:about="#hasSuperClass"/>
            </owl:onProperty>
            <owl:minCardinality rdf:datatype="http://www.w3.org/2001/XMLSchema#int"
            >2</owl:minCardinality>
          </owl:Restriction>
        </owl:intersectionOf>
      </owl:Class>
    </owl:equivalentClass>
    <rdfs:subClassOf>
      <owl:Class rdf:about="#StructureConvention"/>
    </rdfs:subClassOf>
  </owl:Class>
  <owl:Class rdf:ID="AggregationL">
    <owl:disjointWith>
      <owl:Class rdf:ID="AggregationR"/>
    </owl:disjointWith>
    <rdfs:subClassOf>
      <owl:Class rdf:about="#Aggregation"/>
    </rdfs:subClassOf>
    <owl:equivalentClass>
      <owl:Class>
        <owl:intersectionOf rdf:parseType="Collection">
          <owl:Restriction>
            <owl:someValuesFrom>
              <owl:Class rdf:about="#AggregationEnd"/>
            </owl:someValuesFrom>
            <owl:onProperty>
              <owl:FunctionalProperty rdf:ID="hasEnd1"/>
            </owl:onProperty>
          </owl:Restriction>
          <owl:Restriction>
            <owl:someValuesFrom>
              <owl:Class rdf:about="#AssociationEnd"/>
            </owl:someValuesFrom>
            <owl:onProperty>
              <owl:FunctionalProperty rdf:ID="hasEnd2"/>
            </owl:onProperty>
          </owl:Restriction>
        </owl:intersectionOf>
      </owl:Class>
    </owl:equivalentClass>
  </owl:Class>
  <owl:Class rdf:ID="AggregationEnd_0m">
    <owl:equivalentClass>
      <owl:Class>
        <owl:intersectionOf rdf:parseType="Collection">
          <owl:Restriction>
            <owl:onProperty>
              <owl:FunctionalProperty rdf:about="#hasAggregationKind"/>
            </owl:onProperty>
            <owl:hasValue rdf:resource="#shared"/>
          </owl:Restriction>
          <owl:Class rdf:about="#AggregationEnd"/>
          <owl:Restriction>
            <owl:hasValue>
              <MultiplicityElement rdf:ID="multiplicity_0m">
                <lowerValue rdf:datatype="http://www.w3.org/2001/XMLSchema#int"
                >0</lowerValue>
                <upperValue rdf:datatype="http://www.w3.org/2001/XMLSchema#int"
                >-1</upperValue>
              </MultiplicityElement>
            </owl:hasValue>
            <owl:onProperty>
              <owl:FunctionalProperty rdf:about="#hasMultiplicity"/>
            </owl:onProperty>
          </owl:Restriction>
        </owl:intersectionOf>
      </owl:Class>
    </owl:equivalentClass>
  </owl:Class>
  <owl:Class rdf:about="#GraphElement">
    <owl:disjointWith rdf:resource="#UML"/>
    <owl:disjointWith rdf:resource="#SString"/>
    <owl:disjointWith>
      <owl:Class rdf:about="#ValuePartition"/>
    </owl:disjointWith>
  </owl:Class>
  <owl:Class rdf:ID="QualityCritique">
    <owl:disjointWith>
      <owl:Class rdf:about="#ValuePartition"/>
    </owl:disjointWith>
    <rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string"
    >A taxonomy of UML model quality. UML elements will be classified into different quality categories according to their properties. All instances of this class are inferred instances.</rdfs:comment>
  </owl:Class>
  <owl:Class rdf:ID="BadOperationName">
    <rdfs:subClassOf>
      <owl:Class rdf:ID="OperationNamingConvention"/>
    </rdfs:subClassOf>
  </owl:Class>
  <owl:Class rdf:ID="BadAssociationName_IllegalCharacter">
    <owl:equivalentClass>
      <owl:Class>
        <owl:intersectionOf rdf:parseType="Collection">
          <owl:Class>
            <owl:complementOf>
              <owl:Class rdf:ID="LegalCharacter"/>
            </owl:complementOf>
          </owl:Class>
          <owl:Class rdf:about="#AssociationName"/>
          <owl:Class rdf:about="#NonEmptyString"/>
        </owl:intersectionOf>
      </owl:Class>
    </owl:equivalentClass>
    <rdfs:subClassOf>
      <owl:Class rdf:about="#BadAssociationName"/>
    </rdfs:subClassOf>
  </owl:Class>
  <owl:Class rdf:ID="BadAssociationName_Empty">
    <rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string"
    >When an association name is empty, this means an association is missing a label.</rdfs:comment>
    <rdfs:subClassOf>
      <owl:Class rdf:about="#BadAssociationName"/>
    </rdfs:subClassOf>
    <owl:equivalentClass>
      <owl:Class>
        <owl:intersectionOf rdf:parseType="Collection">
          <owl:Class rdf:about="#AssociationName"/>
          <owl:Class rdf:ID="EmptyString"/>
        </owl:intersectionOf>
      </owl:Class>
    </owl:equivalentClass>
  </owl:Class>
  <owl:Class rdf:ID="WholePartRelationship_pw">
    <rdfs:subClassOf>
      <owl:Class rdf:ID="WholePartRelationship"/>
    </rdfs:subClassOf>
    <owl:equivalentClass>
      <owl:Class>
        <owl:unionOf rdf:parseType="Collection">
          <owl:Class rdf:about="#AggregationR"/>
          <owl:Class rdf:about="#CompositionR"/>
        </owl:unionOf>
      </owl:Class>
    </owl:equivalentClass>
  </owl:Class>
  <owl:Class rdf:about="#UMLNamedElement">
    <rdfs:subClassOf>
      <owl:Class rdf:ID="UMLElement"/>
    </rdfs:subClassOf>
    <owl:disjointWith>
      <owl:Class rdf:ID="AggregationKind"/>
    </owl:disjointWith>
    <owl:disjointWith>
      <owl:Class rdf:ID="MultiplicityElement"/>
    </owl:disjointWith>
  </owl:Class>
  <owl:Class rdf:about="#AggregationEnd">
    <rdfs:subClassOf rdf:resource="#RelationshipEnd"/>
    <owl:disjointWith>
      <owl:Class rdf:about="#CompositionEnd"/>
    </owl:disjointWith>
    <owl:disjointWith>
      <owl:Class rdf:about="#AssociationEnd"/>
    </owl:disjointWith>
    <owl:equivalentClass>
      <owl:Class>
        <owl:intersectionOf rdf:parseType="Collection">
          <owl:Restriction>
            <owl:onProperty>
              <owl:FunctionalProperty rdf:about="#hasAggregationKind"/>
            </owl:onProperty>
            <owl:hasValue rdf:resource="#shared"/>
          </owl:Restriction>
          <owl:Restriction>
            <owl:someValuesFrom>
              <owl:Class rdf:about="#Aggregation"/>
            </owl:someValuesFrom>
            <owl:onProperty>
              <owl:FunctionalProperty rdf:about="#hasRelationship"/>
            </owl:onProperty>
          </owl:Restriction>
        </owl:intersectionOf>
      </owl:Class>
    </owl:equivalentClass>
  </owl:Class>
  <owl:Class rdf:ID="PartOfSpeechModifierTag">
    <rdfs:subClassOf>
      <owl:Class rdf:ID="PartOfSpeechTag"/>
    </rdfs:subClassOf>
    <owl:equivalentClass>
      <owl:Class>
        <owl:oneOf rdf:parseType="Collection">
          <PartOfSpeechModifierTag rdf:ID="PluralNounTag"/>
          <PartOfSpeechModifierTag rdf:ID="SingularNounTag"/>
        </owl:oneOf>
      </owl:Class>
    </owl:equivalentClass>
  </owl:Class>
  <owl:Class rdf:ID="AggregationEnd_Optional">
    <owl:equivalentClass>
      <owl:Class>
        <owl:intersectionOf rdf:parseType="Collection">
          <owl:Class rdf:about="#AggregationEnd"/>
          <owl:Restriction>
            <owl:onProperty>
              <owl:FunctionalProperty rdf:about="#hasAggregationKind"/>
            </owl:onProperty>
            <owl:hasValue rdf:resource="#shared"/>
          </owl:Restriction>
          <owl:Restriction>
            <owl:allValuesFrom>
              <owl:Class rdf:ID="OptionalMultiplicity"/>
            </owl:allValuesFrom>
            <owl:onProperty>
              <owl:FunctionalProperty rdf:about="#hasMultiplicity"/>
            </owl:onProperty>
          </owl:Restriction>
        </owl:intersectionOf>
      </owl:Class>
    </owl:equivalentClass>
    <owl:disjointWith>
      <owl:Class rdf:ID="AggregationEnd_Mandatory"/>
    </owl:disjointWith>
  </owl:Class>
  <owl:Class rdf:ID="BadLayout_WholePartRelationship">
    <rdfs:subClassOf>
      <owl:Class rdf:ID="BadLayout"/>
    </rdfs:subClassOf>
  </owl:Class>
  <owl:Class rdf:about="#BadLayout">
    <rdfs:subClassOf>
      <owl:Class rdf:about="#StructureConvention"/>
    </rdfs:subClassOf>
  </owl:Class>
  <owl:Class rdf:ID="BadAttributeName_CapitalizedString">
    <owl:equivalentClass>
      <owl:Class>
        <owl:intersectionOf rdf:parseType="Collection">
          <owl:Class rdf:ID="AttributeName"/>
          <owl:Class rdf:ID="CapitalizedString"/>
        </owl:intersectionOf>
      </owl:Class>
    </owl:equivalentClass>
    <rdfs:subClassOf>
      <owl:Class rdf:ID="BadAttributeName"/>
    </rdfs:subClassOf>
  </owl:Class>
  <owl:Class rdf:about="#StructureConvention">
    <rdfs:subClassOf>
      <owl:Class rdf:ID="CommonConvention"/>
    </rdfs:subClassOf>
  </owl:Class>
  <owl:Class rdf:ID="BadOperationName_IllegalCharacter">
    <owl:equivalentClass>
      <owl:Class>
        <owl:intersectionOf rdf:parseType="Collection">
          <owl:Class rdf:about="#OperationName"/>
          <owl:Class rdf:about="#NonEmptyString"/>
          <owl:Class>
            <owl:complementOf>
              <owl:Class rdf:about="#LegalCharacter"/>
            </owl:complementOf>
          </owl:Class>
        </owl:intersectionOf>
      </owl:Class>
    </owl:equivalentClass>
    <rdfs:subClassOf rdf:resource="#BadOperationName"/>
  </owl:Class>
  <owl:Class rdf:ID="Axiom_2">
    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#Restriction"/>
    <owl:equivalentClass>
      <owl:Restriction>
        <owl:onProperty>
          <owl:FunctionalProperty rdf:about="#hasMultiplicity"/>
        </owl:onProperty>
        <owl:someValuesFrom>
          <owl:Class rdf:about="#MultiplicityElement"/>
        </owl:someValuesFrom>
      </owl:Restriction>
    </owl:equivalentClass>
  </owl:Class>
  <owl:Class rdf:about="#NonEmptyString">
    <owl:disjointWith>
      <owl:Class rdf:about="#EmptyString"/>
    </owl:disjointWith>
    <rdfs:subClassOf rdf:resource="#SString"/>
    <owl:equivalentClass>
      <owl:Restriction>
        <owl:onProperty>
          <owl:FunctionalProperty rdf:ID="isEmpty"/>
        </owl:onProperty>
        <owl:hasValue rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean"
        >false</owl:hasValue>
      </owl:Restriction>
    </owl:equivalentClass>
  </owl:Class>
  <owl:Class rdf:ID="BadClassName_Empty">
    <rdfs:subClassOf>
      <owl:Class rdf:ID="BadClassName"/>
    </rdfs:subClassOf>
    <owl:equivalentClass>
      <owl:Class>
        <owl:intersectionOf rdf:parseType="Collection">
          <owl:Class rdf:about="#EmptyString"/>
          <owl:Class rdf:ID="ClassName"/>
        </owl:intersectionOf>
      </owl:Class>
    </owl:equivalentClass>
  </owl:Class>
  <owl:Class rdf:about="#Classifier">
    <rdfs:subClassOf rdf:resource="#UMLNamedElement"/>
    <owl:disjointWith rdf:resource="#RelationshipEnd"/>
    <owl:disjointWith rdf:resource="#Relationship"/>
  </owl:Class>
  <owl:Class rdf:about="#OperationNamingConvention">
    <rdfs:subClassOf>
      <owl:Class rdf:about="#NamingConvention"/>
    </rdfs:subClassOf>
  </owl:Class>
  <owl:Class rdf:about="#AggregationEnd_Mandatory">
    <owl:disjointWith rdf:resource="#AggregationEnd_Optional"/>
    <owl:equivalentClass>
      <owl:Class>
        <owl:intersectionOf rdf:parseType="Collection">
          <owl:Class rdf:about="#AggregationEnd"/>
          <owl:Restriction>
            <owl:onProperty>
              <owl:FunctionalProperty rdf:about="#hasAggregationKind"/>
            </owl:onProperty>
            <owl:hasValue rdf:resource="#shared"/>
          </owl:Restriction>
          <owl:Restriction>
            <owl:onProperty>
              <owl:FunctionalProperty rdf:about="#hasMultiplicity"/>
            </owl:onProperty>
            <owl:allValuesFrom>
              <owl:Class rdf:ID="MandatoryMultiplicity"/>
            </owl:allValuesFrom>
          </owl:Restriction>
        </owl:intersectionOf>
      </owl:Class>
    </owl:equivalentClass>
  </owl:Class>
  <owl:Class rdf:about="#AssociationEnd">
    <owl:disjointWith>
      <owl:Class rdf:about="#CompositionEnd"/>
    </owl:disjointWith>
    <owl:disjointWith rdf:resource="#AggregationEnd"/>
    <owl:equivalentClass>
      <owl:Restriction>
        <owl:hasValue>
          <AggregationKind rdf:ID="none"/>
        </owl:hasValue>
        <owl:onProperty>
          <owl:FunctionalProperty rdf:about="#hasAggregationKind"/>
        </owl:onProperty>
      </owl:Restriction>
    </owl:equivalentClass>
    <rdfs:subClassOf rdf:resource="#RelationshipEnd"/>
  </owl:Class>
  <owl:Class rdf:ID="Attribute">
    <rdfs:subClassOf rdf:resource="#UMLNamedElement"/>
  </owl:Class>
  <owl:Class rdf:ID="BadClassName_IllegalCharacter">
    <rdfs:subClassOf>
      <owl:Class rdf:about="#BadClassName"/>
    </rdfs:subClassOf>
    <owl:equivalentClass>
      <owl:Class>
        <owl:intersectionOf rdf:parseType="Collection">
          <owl:Class rdf:about="#ClassName"/>
          <owl:Class rdf:about="#NonEmptyString"/>
          <owl:Class>
            <owl:complementOf>
              <owl:Class rdf:about="#LegalCharacter"/>
            </owl:complementOf>
          </owl:Class>
        </owl:intersectionOf>
      </owl:Class>
    </owl:equivalentClass>
  </owl:Class>
  <owl:Class rdf:ID="AssociationEnd_Optional">
    <owl:equivalentClass>
      <owl:Class>
        <owl:intersectionOf rdf:parseType="Collection">
          <owl:Class rdf:about="#AssociationEnd"/>
          <owl:Restriction>
            <owl:hasValue rdf:resource="#none"/>
            <owl:onProperty>
              <owl:FunctionalProperty rdf:about="#hasAggregationKind"/>
            </owl:onProperty>
          </owl:Restriction>
          <owl:Restriction>
            <owl:someValuesFrom>
              <owl:Class rdf:about="#OptionalMultiplicity"/>
            </owl:someValuesFrom>
            <owl:onProperty>
              <owl:FunctionalProperty rdf:about="#hasMultiplicity"/>
            </owl:onProperty>
          </owl:Restriction>
        </owl:intersectionOf>
      </owl:Class>
    </owl:equivalentClass>
    <owl:disjointWith>
      <owl:Class rdf:ID="AssociationEnd_Mandatory"/>
    </owl:disjointWith>
  </owl:Class>
  <owl:Class rdf:ID="ReplicatedAssociation">
    <owl:equivalentClass>
      <owl:Class>
        <owl:intersectionOf rdf:parseType="Collection">
          <owl:Class rdf:about="#Association"/>
          <owl:Restriction>
            <owl:onProperty>
              <owl:FunctionalProperty rdf:ID="isReplicated"/>
            </owl:onProperty>
            <owl:hasValue rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean"
            >true</owl:hasValue>
          </owl:Restriction>
        </owl:intersectionOf>
      </owl:Class>
    </owl:equivalentClass>
    <rdfs:subClassOf rdf:resource="#StructureConvention"/>
  </owl:Class>
  <owl:Class rdf:about="#EmptyString">
    <owl:disjointWith rdf:resource="#NonEmptyString"/>
    <owl:equivalentClass>
      <owl:Restriction>
        <owl:onProperty>
          <owl:FunctionalProperty rdf:about="#isEmpty"/>
        </owl:onProperty>
        <owl:hasValue rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean"
        >true</owl:hasValue>
      </owl:Restriction>
    </owl:equivalentClass>
    <rdfs:subClassOf rdf:resource="#SString"/>
  </owl:Class>
  <owl:Class rdf:about="#CompositionEnd">
    <owl:equivalentClass>
      <owl:Class>
        <owl:intersectionOf rdf:parseType="Collection">
          <owl:Restriction>
            <owl:someValuesFrom rdf:resource="#Composition"/>
            <owl:onProperty>
              <owl:FunctionalProperty rdf:about="#hasRelationship"/>
            </owl:onProperty>
          </owl:Restriction>
          <owl:Restriction>
            <owl:onProperty>
              <owl:FunctionalProperty rdf:about="#hasAggregationKind"/>
            </owl:onProperty>
            <owl:hasValue>
              <AggregationKind rdf:ID="composite"/>
            </owl:hasValue>
          </owl:Restriction>
        </owl:intersectionOf>
      </owl:Class>
    </owl:equivalentClass>
    <rdfs:subClassOf rdf:resource="#RelationshipEnd"/>
    <owl:disjointWith rdf:resource="#AggregationEnd"/>
    <owl:disjointWith rdf:resource="#AssociationEnd"/>
  </owl:Class>
  <owl:Class rdf:about="#Association"