Using an UML Class Diagram to Model DAML+OIL Ontology

Environment: UML

1. Introduction

The immense growth of the World Wide Web in the past decade has ushered in an era in which the development of the Semantic Web is the key to harness the plethora of information available into tangible knowledge.

Tim Berners-Lee1 envisioned the idea of the Semantic Web in which automated agents would scour for intelligent information, whereby software processes would interpret machine-understandable data linked to the Web. The manifestation of the idea is inexplicably linked to the annotation of the Eeb resources with metadata. Standard languages, such as the RDF, RDFS, and DAML+OIL2, for such annotation are being developed under the auspices of World Wide Web Consortium (W3C). However, automated processes would not be able to make use of said languages unless there is a common vocabulary. It is in light of this context that ontologies have come to be regarded as the building blocks of the Semantic Web that can be communicated across people and machines. While these languages have yet to formalise a standard graphical representation, Kogut et. al.3 and Melnick4 have leveraged the use of Unified Modeling Language (UML)5 in expressing and modeling ontologies for knowledge representation.

The Model Driven Architecture (MDA)6 of the Object Management Group (OMG) is facilitating the process of making UML more machine-processable instead of its current usage as just a software modeling tool for the object-oriented programming paradigm. Cranfield7, while generating RDF from UML, have elucidated the following reasons for the usage of UML in developing ontology:

  1. UML Class diagrams can be used to represent ontology.
  2. UML Object diagrams can be used as instances of classes and hence can be regarded as instances of knowledge.

This paper makes use of the class diagram to model the ontology. The similarities between UML and DAML+OIL are many. Both have classes which may or may not have instances. The generalisation/specialisation of UML is translated as subClassOf in DAML+OIL. However, as one of the many differences between UML and DAML+OIL, the modularity of UML is not supported in DAML.

2. UML Class Diagram

Using the UML class diagram of ArgoUML 0.10 and the DUET plugin of DAML+OIL, this section describes an example of ontology. The ontology defines the concepts, attributes, and the relationships of publishers, titles written by authors, and the corresponding sales. Figure 1 presents the ontology as a UML class diagram.

Figure 1: Example of an ontology using an UML class diagram

The Class Diagram represented by rectangles contains four classes: Author, Publisher, Title, and Sales, while the lines between classes represent association relationships between classes. The ends of an association are called roles and the cardinality of a class is represented at the other end of the class. The open arrow indicates that the association is navigable only in one direction, while the closed rhombus denotes a compositional relationship whereby the class at the other end is not aware of the association. Bi-directional navigation does not show arrows. The line with the closed arrow denotes a generalisation/specialisation relationship. Stereotypes are represented as <<>>. The scope of the attributes and the classes are of the type public because DAML+OIL unlike UML only supports visibility of type public. The DAML+OIL encoding of the preceding UML class diagram is shown in Appendix A.

3. UML to DAML Mapping

3.1 Package

The package BookPublisher with the stereotype <<DAML ontology>>, as shown in Figure 2, is mapped as Ontology in DAML while the name of the package is translated as rdf:about. This is shown in Listing 1:

Figure 2: Example of DAMLontology package diagram in UML

Listing 1: DAML+OIL code translation of package

<?xml version='1.0' encoding='ISO-8859-1'?>
<!DOCTYPE rdf:RDF [
  <!ENTITY rdf 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
  <!ENTITY a 'http://www.daml.org/2001/03/daml+oil#'>
]>
<rdf:RDF xmlns_a="&a;"
  xmlns_rdf="&rdf;">
<a:Ontology rdf_about="BookPublisher"/>

3.2 Classes and Attributes

The classes in UML, as shown in Figure 3, are generated as classes in DAML while the attributes of the classes in UML are generated as DatatypeProperty (see Listing 2).

Figure 3: Example of class Author diagram in UML

Listing 2: DAML+OIL code translation of Classes and Attributes

<a:Class rdf_about="BookPublisher#Author">
  <a:subClassOf rdf_resource="BookPublisher#DUET0"/>
  <a:subClassOf rdf_resource="BookPublisher#DUET12"/>
  <a:subClassOf rdf_resource="BookPublisher#DUET15"/>
  <a:subClassOf rdf_resource="BookPublisher#DUET24"/>
  <a:subClassOf rdf_resource="BookPublisher#DUET27"/>
  <a:subClassOf rdf_resource="BookPublisher#DUET3"/>
</a:Class>
<a:DatatypeProperty rdf_about="BookPublisher#Author_Bio">
  <a:domain rdf_resource="BookPublisher#Author"/>
  <a:range rdf_resource="BookPublisher#String"/>
</a:DatatypeProperty>
<a:DatatypeProperty rdf_about="BookPublisher#Author_Fname">
  <a:domain rdf_resource="BookPublisher#Author"/>
  <a:range rdf_resource="BookPublisher#String"/>
</a:DatatypeProperty>
<a:DatatypeProperty rdf_about="BookPublisher#Author_Lname">
  <a:domain rdf_resource="BookPublisher#Author"/>
  <a:range rdf_resource="BookPublisher#String"/>
</a:DatatypeProperty>
<a:DatatypeProperty rdf_about="BookPublisher#Author_email">
  <a:domain rdf_resource="BookPublisher#Author"/>
  <a:range rdf_resource="BookPublisher#String"/>
</a:DatatypeProperty>
<a:DatatypeProperty rdf_about="BookPublisher#Author_payment">
  <a:domain rdf_resource="BookPublisher#Author"/>
  <a:range rdf_resource="BookPublisher#double"/>
</a:DatatypeProperty>
<a:DatatypeProperty rdf_about="BookPublisher#Author_phone">
  <a:domain rdf_resource="BookPublisher#Author"/>
  <a:range rdf_resource="BookPublisher#String"/>
</a:DatatypeProperty>

The domain is mapped to the source of the class, whereas the data type of the attribute is mapped to the range.

3.3 Generalisation/Specialisation

The UML Generalisation/Specialisation is mapped as either subClassOf or subPropertyOf depending on the stereotype used. Classes without the specification of any stereotype, represented in Figure 4, would generate a subClassOf, as demonstrated in the code in Listing 3:

Figure 4: Example of Generalisation/Specialisation diagram in UML

Listing 3: DAML+OIL code translation of Generalisation/Specialisation

<?xml version='1.0' encoding='ISO-8859-1'?>
<!DOCTYPE rdf:RDF [
  <!ENTITY rdf 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
  <!ENTITY a 'http://www.daml.org/2001/03/daml+oil#'>
]>
<rdf:RDF xmlns_a="&a;"
   xmlns_rdf="&rdf;">
<a:Ontology rdf_about="BookPublisher"/>
<a:Class rdf_about="BookPublisher#Sales">
  <a:subClassOf rdf_resource="BookPublisher#Title"/>
</a:Class>
<a:DatatypeProperty rdf_about="BookPublisher#Sales_amount">
  <a:domain rdf_resource="BookPublisher#Sales"/>
  <a:range rdf_resource="BookPublisher#double"/>
</a:DatatypeProperty>
<a:DatatypeProperty rdf_about="BookPublisher#Sales_date">
  <a:domain rdf_resource="BookPublisher#Sales"/>
  <a:range rdf_resource="BookPublisher#String"/>
</a:DatatypeProperty>
<a:DatatypeProperty rdf_about="BookPublisher#Sales_quantity">
  <a:domain rdf_resource="BookPublisher#Sales"/>
  <a:range rdf_resource="BookPublisher#double"/>
</a:DatatypeProperty>
<a:Datatype rdf_about="BookPublisher#String"/>
<a:Class rdf_about="BookPublisher#Title"/>
<a:DatatypeProperty rdf_about="BookPublisher#Title_ISBN">
  <a:range rdf_resource="BookPublisher#String"/>
  <a:domain rdf_resource="BookPublisher#Title"/>
</a:DatatypeProperty>
<a:DatatypeProperty rdf_about="BookPublisher#Title_name">
  <a:range rdf_resource="BookPublisher#String"/>
  <a:domain rdf_resource="BookPublisher#Title"/>
</a:DatatypeProperty>
<a:DatatypeProperty rdf_about="BookPublisher#Title_price">
  <a:domain rdf_resource="BookPublisher#Title"/>
  <a:range rdf_resource="BookPublisher#double"/>
</a:DatatypeProperty>
<a:DatatypeProperty rdf_about="BookPublisher#Title_pubdate">
  <a:range rdf_resource="BookPublisher#String"/>
  <a:domain rdf_resource="BookPublisher#Title"/>
</a:DatatypeProperty>
<a:Datatype rdf_about="BookPublisher#double"/>
</rdf:RDF>

A stereotype of <<DAMLporperty>> on the UML class, as shown in Figure 5, will generate a mapping of subPropertyOf (see Listing 4).

Figure 5: Example of DAMLproperty diagram in UML

Listing 4: DAML+OIL coding translation of Dataproperty

<?xml version='1.0' encoding='ISO-8859-1'?>
<!DOCTYPE rdf:RDF [
  <!ENTITY rdf 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
  <!ENTITY a 'http://www.daml.org/2001/03/daml+oil#'>
]>
<rdf:RDF xmlns_a="&a;"
  xmlns_rdf="&rdf;">
<a:Ontology rdf_about="BookPublisher"/>
<a:Property rdf_about="BookPublisher#Sales">
  <a:subPropertyOf rdf_resource="BookPublisher#Title"/>
</a:Property>
<a:DatatypeProperty rdf_about="BookPublisher#Sales_amount">
  <a:domain rdf_resource="BookPublisher#Sales"/>
  <a:range rdf_resource="BookPublisher#double"/>
</a:DatatypeProperty>
<a:DatatypeProperty rdf_about="BookPublisher#Sales_date">
  <a:domain rdf_resource="BookPublisher#Sales"/>
  <a:range rdf_resource="BookPublisher#String"/>
</a:DatatypeProperty>
<a:DatatypeProperty rdf_about="BookPublisher#Sales_quantity">
  <a:domain rdf_resource="BookPublisher#Sales"/>
  <a:range rdf_resource="BookPublisher#double"/>
</a:DatatypeProperty>
<a:Datatype rdf_about="BookPublisher#String"/>
<a:Property rdf_about="BookPublisher#Title"/>
<a:DatatypeProperty rdf_about="BookPublisher#Title_ISBN">
  <a:range rdf_resource="BookPublisher#String"/>
  <a:domain rdf_resource="BookPublisher#Title"/>
</a:DatatypeProperty>
<a:DatatypeProperty rdf_about="BookPublisher#Title_name">
  <a:range rdf_resource="BookPublisher#String"/>
  <a:domain rdf_resource="BookPublisher#Title"/>
</a:DatatypeProperty>
<a:DatatypeProperty rdf_about="BookPublisher#Title_price">
  <a:domain rdf_resource="BookPublisher#Title"/>
  <a:range rdf_resource="BookPublisher#double"/>
</a:DatatypeProperty>
<a:DatatypeProperty rdf_about="BookPublisher#Title_pubdate">
  <a:range rdf_resource="BookPublisher#String"/>
  <a:domain rdf_resource="BookPublisher#Title"/>
</a:DatatypeProperty>
<a:Datatype rdf_about="BookPublisher#double"/>
</rdf:RDF>

3.4 Associations and Roles

The association and the roles of the UML, as shown in Figure 6, are translated as shown in the coding in Listing 5.

Figure 6: Example of association diagram in UML

Associations are translated as ObjectProperty in DAML+OIL. However, ObjectProperty items are first-class objects while associations in UML are not. ObjectProperty can exist independently of classes. Associations in UML are defined in terms of association ends, which are related to classifiers. While UML supports multiple associations, only binary associations are supported in DAML+OIL. UML binary associations have only 1 domain class and 1 range class, whereas a DAML property can have multiple domains. It is the direction of the association which determines the source and the object of ObjectProperty.

The association ends are translated as Restrictions in DAML+OIL. The property’s source becomes a subClassOf Restriction. The Restriction has an onProperty value of the Object Property and a toClass value of the object class. The role of the association with a single value in UML will generate a cardinality of 1 while an association end with many values would generate a value of minCardinality.

Listing 5: DAML+OIL coding translation of association and roles

<?xml version='1.0' encoding='ISO-8859-1'?>
<!DOCTYPE rdf:RDF [
  <!ENTITY rdf 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
  <!ENTITY a 'http://www.daml.org/2001/03/daml+oil#'>
]>
<rdf:RDF xmlns_a="&a;"
  xmlns_rdf="&rdf;">
<a:Ontology rdf_about="BookPublisher"/>
<a:Class rdf_about="BookPublisher#Author">
  <a:subClassOf rdf_resource="BookPublisher#DUET6"/>
  <a:subClassOf rdf_resource="BookPublisher#DUET9"/>
</a:Class>
<a:DatatypeProperty rdf_about="BookPublisher#Author_bio">
  <a:domain rdf_resource="BookPublisher#Author"/>
  <a:range rdf_resource="BookPublisher#String"/>
</a:DatatypeProperty>
<a:DatatypeProperty rdf_about="BookPublisher#Author_email">
  <a:domain rdf_resource="BookPublisher#Author"/>
  <a:range rdf_resource="BookPublisher#String"/>
</a:DatatypeProperty>
<a:DatatypeProperty rdf_about="BookPublisher#Author_fname">
  <a:domain rdf_resource="BookPublisher#Author"/>
  <a:range rdf_resource="BookPublisher#String"/>
</a:DatatypeProperty>
<a:DatatypeProperty rdf_about="BookPublisher#Author_lname">
  <a:domain rdf_resource="BookPublisher#Author"/>
  <a:range rdf_resource="BookPublisher#String"/>
</a:DatatypeProperty>
<a:DatatypeProperty rdf_about="BookPublisher#Author_payment">
  <a:domain rdf_resource="BookPublisher#Author"/>
  <a:range rdf_resource="BookPublisher#double"/>
</a:DatatypeProperty>
<a:DatatypeProperty rdf_about="BookPublisher#Author_phone">
  <a:domain rdf_resource="BookPublisher#Author"/>
  va:range rdf_resource="BookPublisher#String"/>
</a:DatatypeProperty>
<a:Restriction rdf_about="BookPublisher#DUET0">
  <a:toClass rdf_resource="BookPublisher#Author"/>
  <a:onProperty rdf_resource="BookPublisher#authorpublisher"/>
</a:Restriction>
<a:Restriction rdf_about="BookPublisher#DUET12">
  <a:toClass rdf_resource="BookPublisher#Author"/>
  <a:onProperty rdf_resource="BookPublisher#hasMany"/>
</a:Restriction>
<a:Restriction rdf_about="BookPublisher#DUET15"
  a_minCardinality="1">
  <a:onProperty rdf_resource="BookPublisher#hasMany"/>
</a:Restriction>
<a:Restriction rdf_about="BookPublisher#DUET3"
  a_minCardinality="1">
  <a:onProperty rdf_resource="BookPublisher#authorpublisher"/>
</a:Restriction>
<a:Restriction rdf_about="BookPublisher#DUET6">
  <a:toClass rdf_resource="BookPublisher#Publisher"/>
  <a:onProperty rdf_resource="BookPublisher#hasOne"/>
</a:Restriction>
<a:Restriction rdf_about="BookPublisher#DUET9"
  a_cardinality="1">
  <a:onProperty rdf_resource="BookPublisher#hasOne"/>
</a:Restriction>
<a:Class rdf_about="BookPublisher#Publisher">
  <a:subClassOf rdf_resource="BookPublisher#DUET0"/>
  <a:subClassOf rdf_resource="BookPublisher#DUET12"/>
  <a:subClassOf rdf_resource="BookPublisher#DUET15"/>
  <a:subClassOf rdf_resource="BookPublisher#DUET3"/>
</a:Class>
<a:DatatypeProperty rdf_about="BookPublisher#Publisher_address">
  <a:domain rdf_resource="BookPublisher#Publisher"/>
  <a:range rdf_resource="BookPublisher#String"/>
</a:DatatypeProperty>
<a:DatatypeProperty rdf_about="BookPublisher#Publisher_name">
  <a:domain rdf_resource="BookPublisher#Publisher"/>
  <a:range rdf_resource="BookPublisher#String"/>
</a:DatatypeProperty>
<a:Datatype rdf_about="BookPublisher#String"/>
<a:ObjectProperty rdf_about="BookPublisher#authorpublisher"/>
<a:Datatype rdf_about="BookPublisher#double"/>
<a:ObjectProperty rdf_about="BookPublisher#hasMany">
  <a:subPropertyOf rdf_resource="BookPublisher#authorpublisher"/>
</a:ObjectProperty>
<a:ObjectProperty rdf_about="BookPublisher#hasOne">
  <a:subPropertyOf rdf_resource="BookPublisher#authorpublisher"/>
</a:ObjectProperty>
</rdf:RDF>

References

  1. Berners-Lee, T., Weaving the Web, Orion Business Books, London, 1999
  2. http://www.daml.org
  3. Kogut, P., Cranfield, S., Hart, L., Dutra, M., Baclawski, K., Kokar, M., and Smith, J., “UML for Ontology Development.”
  4. Melnik, S., “Representing UML in RDF.”
    http://www-db.stanford.edu/~melnik/rdf/uml
  5. http://www.omg.org/technology/uml
  6. http://www.omg.org/mda
  7. Cranfield, S., “UML and the Semantic Web,” Proc. of the International Semantic Web Working Symposium, Palo Alto, 2001

Appendix A

DAML+OIL coding translation of the UML diagram shown in Figure 1.

<?xml version='1.0' encoding='ISO-8859-1'?>
<!DOCTYPE rdf:RDF [
  <!ENTITY rdf 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
  <!ENTITY a 'http://www.daml.org/2001/03/daml+oil#'>
]>
<rdf:RDF xmlns_a="&a;"
   xmlns_rdf="&rdf;">
<a:Ontology rdf_about="BookPublisher"/>
<a:Class rdf_about="BookPublisher#Author">
  <a:subClassOf rdf_resource="BookPublisher#DUET0"/>
  <a:subClassOf rdf_resource="BookPublisher#DUET12"/>
  <a:subClassOf rdf_resource="BookPublisher#DUET15"/>
  <a:subClassOf rdf_resource="BookPublisher#DUET24"/>
  <a:subClassOf rdf_resource="BookPublisher#DUET27"/>
  <a:subClassOf rdf_resource="BookPublisher#DUET3"/>
</a:Class>
<a:DatatypeProperty rdf_about="BookPublisher#Author_Bio">
  <a:domain rdf_resource="BookPublisher#Author"/>
  <a:range rdf_resource="BookPublisher#String"/>
</a:DatatypeProperty>
<a:DatatypeProperty rdf_about="BookPublisher#Author_Fname">
  <a:domain rdf_resource="BookPublisher#Author"/>
  <a:range rdf_resource="BookPublisher#String"/>
</a:DatatypeProperty>
<a:DatatypeProperty rdf_about="BookPublisher#Author_Lname">
  <a:domain rdf_resource="BookPublisher#Author"/>
  <a:range rdf_resource="BookPublisher#String"/>
</a:DatatypeProperty>
<a:DatatypeProperty rdf_about="BookPublisher#Author_email">
  <a:domain rdf_resource="BookPublisher#Author"/>
  <a:range rdf_resource="BookPublisher#String"/>
</a:DatatypeProperty>
<a:DatatypeProperty rdf_about="BookPublisher#Author_payment">
  <a:domain rdf_resource="BookPublisher#Author"/>
  <a:range rdf_resource="BookPublisher#double"/>
</a:DatatypeProperty>
<a:DatatypeProperty rdf_about="BookPublisher#Author_phone">
  <a:domain rdf_resource="BookPublisher#Author"/>
  <a:range rdf_resource="BookPublisher#String"/>
</a:DatatypeProperty>
<a:Restriction rdf_about="BookPublisher#DUET0">
  <a:toClass rdf_resource="BookPublisher#Title"/>
  <a:onProperty rdf_resource="BookPublisher#titlesauthors"/>
</a:Restriction>
<a:Restriction rdf_about="BookPublisher#DUET12">
  <a:toClass rdf_resource="BookPublisher#Title"/>
  <a:onProperty rdf_resource="BookPublisher#hasManytitles"/>
</a:Restriction>
<a:Restriction rdf_about="BookPublisher#DUET15"
  a_minCardinality="1">
  <a:onProperty rdf_resource="BookPublisher#hasManytitles"/>
</a:Restriction>
<a:Restriction rdf_about="BookPublisher#DUET18">
  <a:toClass rdf_resource="BookPublisher#Author"/>
  <a:onProperty rdf_resource="BookPublisher#authorpublisher"/>
</a:Restriction>
<a:Restriction rdf_about="BookPublisher#DUET21"
  a_minCardinality="1">
  <a:onProperty rdf_resource="BookPublisher#authorpublisher"/>
</a:Restriction>
<a:Restriction rdf_about="BookPublisher#DUET24">
  <a:toClass rdf_resource="BookPublisher#Publisher"/>
  <a:onProperty rdf_resource="BookPublisher#hasOnepublisher"/>
</a:Restriction>
<a:Restriction rdf_about="BookPublisher#DUET27"
  a_cardinality="1>>
  <a:onProperty rdf_resource="BookPublisher#hasOnepublisher"/>
</a:Restriction>
<a:Restriction rdf_about="BookPublisher#DUET3"
  a_minCardinality="1">
  <a:onProperty rdf_resource="BookPublisher#titlesauthors"/>
</a:Restriction>
<a:Restriction rdf_about="BookPublisher#DUET30">
  <a:toClass rdf_resource="BookPublisher#Author"/>
  <a:onProperty rdf_resource="BookPublisher#hasManyauthors"/>
</a:Restriction>
<a:Restriction rdf_about="BookPublisher#DUET33"
  a_minCardinality="1">
  <a:onProperty rdf_resource="BookPublisher#hasManyauthors"/>
</a:Restriction>
<a:Restriction rdf_about="BookPublisher#DUET6">
  <a:toClass rdf_resource="BookPublisher#Author"/>
  <a:onProperty rdf_resource="BookPublisher#hasManyauthors"/>
</a:Restriction>
<a:Restriction rdf_about="BookPublisher#DUET9"
  a_minCardinality="1">
  <a:onProperty rdf_resource="BookPublisher#hasManyauthors"/>
</a:Restriction>
<a:Class rdf_about="BookPublisher#Publisher">
  <a:subClassOf rdf_resource="BookPublisher#DUET18"/>
  <a:subClassOf rdf_resource="BookPublisher#DUET21"/>
  <a:subClassOf rdf_resource="BookPublisher#DUET30"/>
  <a:subClassOf rdf_resource="BookPublisher#DUET33"/>
</a:Class>
<a:DatatypeProperty rdf_about="BookPublisher#Publisher_address">
  <a:domain rdf_resource="BookPublisher#Publisher"/>
  <a:range rdf_resource="BookPublisher#String"/>
</a:DatatypeProperty>
<a:DatatypeProperty rdf_about="BookPublisher#Publisher_name">
  <a:domain rdf_resource="BookPublisher#Publisher"/>
  <a:range rdf_resource="BookPublisher#String"/>
</a:DatatypeProperty>
<a:DatatypeProperty rdf_about="BookPublisher#Sale_amount">
  <a:domain rdf_resource="BookPublisher#Sales"/>
  <a:range rdf_resource="BookPublisher#double"/>
</a:DatatypeProperty>
<a:DatatypeProperty rdf_about="BookPublisher#Sale_date">
  <a:domain rdf_resource="BookPublisher#Sales"/>
  <a:range rdf_resource="BookPublisher#String"/>
</a:DatatypeProperty>
<a:DatatypeProperty rdf_about="BookPublisher#Sale_quantity">
  <a:domain rdf_resource="BookPublisher#Sales"/>
  <a:range rdf_resource="BookPublisher#double"/>
</a:DatatypeProperty>
<a:Class rdf_about="BookPublisher#Sales">
  <a:subClassOf rdf_resource="BookPublisher#Title"/>
</a:Class>
<a:Datatype rdf_about="BookPublisher#String"/>
<a:Class rdf_about="BookPublisher#Title">
  <a:subClassOf rdf_resource="BookPublisher#DUET6"/>
  <a:subClassOf rdf_resource="BookPublisher#DUET9"/>
</a:Class>
<a:DatatypeProperty rdf_about="BookPublisher#Title_ISBN">
  <a:range rdf_resource="BookPublisher#String"/>
  <a:domain rdf_resource="BookPublisher#Title"/>
</a:DatatypeProperty>
<a:DatatypeProperty rdf_about="BookPublisher#Title_name">
  <a:range rdf_resource="BookPublisher#String"/>
  <a:domain rdf_resource="BookPublisher#Title"/>
</a:DatatypeProperty>
<a:DatatypeProperty rdf_about="BookPublisher#Title_price">
  <a:domain rdf_resource="BookPublisher#Title"/>
  <a:range rdf_resource="BookPublisher#double"/>
</a:DatatypeProperty>
<a:DatatypeProperty rdf_about="BookPublisher#Title_pubdate">
  <a:range rdf_resource="BookPublisher#String"/>
  <a:domain rdf_resource="BookPublisher#Title"/>
</a:DatatypeProperty>
<a:ObjectProperty rdf_about="BookPublisher#authorpublisher"/>
<a:Datatype rdf_about="BookPublisher#double"/>
<a:ObjectProperty rdf_about="BookPublisher#hasManyauthors">
  <a:subPropertyOf rdf_resource="BookPublisher#authorpublisher"/>
</a:ObjectProperty>
<a:ObjectProperty rdf_about="BookPublisher#hasManytitles">
  <a:subPropertyOf rdf_resource="BookPublisher#titlesauthors"/>
</a:ObjectProperty>
<a:ObjectProperty rdf_about="BookPublisher#hasOnepublisher">
  <a:subPropertyOf rdf_resource="BookPublisher#authorpublisher"/>
</a:ObjectProperty>
<a:ObjectProperty rdf_about="BookPublisher#titlesauthors"/>
</rdf:RDF>

Downloads


Download source – 4 Kb

More by Author

Get the Free Newsletter!

Subscribe to Developer Insider for top news, trends & analysis

Must Read