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.



Click here for a larger image.

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


Comments

  • great work

    Posted by Legacy on 01/29/2003 12:00am

    Originally posted by: aras

    keep up..!

    Reply
Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Live Event Date: October 29, 2014 @ 11:00 a.m. ET / 8:00 a.m. PT Are you interested in building a cognitive application using the power of IBM Watson? Need a platform that provides speed and ease for rapidly deploying this application? Join Chris Madison, Watson Solution Architect, as he walks through the process of building a Watson powered application on IBM Bluemix. Chris will talk about the new Watson Services just released on IBM bluemix, but more importantly he will do a step by step cognitive …

  • Email is the most common communication vehicle used by organizations of all shapes and sizes. Among the billions of email messages sent every day are sensitive information, critical requests, and other essential business data. IT staff bear the burden of ensuring the confidentiality, integrity, and availability of the information contained within the communication. This white paper explores the email security landscape, an assessment of the threats organizations face,  and the building blocks of an effective …

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds