[Alignment format] [API]

EDOAL: Expressive and Declarative Ontology Alignment Language

The Expressive and Declarative Ontology Alignment Language (EDOAL) allows for representing correspondences between the entities of different ontologies. Unlike other formats, the alignment vocabulary allows to represent complex correspondences allowing to precisely describe the relation between the entities. The alignment vocabulary extends the Alignment format.

Purpose

Representing ontology alignments is the general purpose of this vocabulary. Particularly, it extends the ontology Alignment format in order to enable the representation of complex correspondences.

This format can be used for cases where expressing equivalence or subsumption between terms is not sufficient, when more precise relations need to be expressed. While term equivalence or subsumption might be enough for exchanging documents, more precise relations are needed to exchange and integrate data.

This vocabulary was originally designed with the goal of representing patterns of correspondence between ontologies. It was since then both simplified and extended to obtain a minimal vocabulary on top of the Alignment format, able to express all possible kinds of ontology alignments.

Features

The alignment vocabulary has the following features:

The buttons below can be used to show or hide the available syntaxes.

In case of conflict, the RDF/XML syntax is the authoritative one. This is also the one for which we have developed parsers and renderers. However, we are glad that you report errors in the other syntaxes as well.

Support

EDOAL is supported in the following way by the Alignment API:

In addition, it is possible to convert alignments from one format to EDOAL in Java. So far, this is not possible in the command-line interface. This is achieved through the static method EDOALAlignment.toEDOALAlignment( al ); such that al is a BasicAlignment. For this to be possible, the API should be able to access the ontologies concerned by the alignment. An example can be found in the EDOALExport test file.

Alignment and cells

In the Alignment format, an alignment is a set of cells, each cell being a correspondence between two entities. The alignment vocabulary extend this scheme by allowing cells to contain compound entity descriptions. Each entity can be typed according to one of the following category: Class, Instance, Relation, Property. A relation corresponds to an object property in OWL, a property to a datatype property. Each entity can then be restricted, and transformation can be specified on propery values.

While Alignment and Cell are described by the Alignment format, we will focus here on the remaining classes.

Namespaces

The namespace for the Alignment format is still http://knowledgeweb.semanticweb.org/heterogeneity/alignment# (usual prefix: align).

EDOAL's own namespace is http://ns.inria.org/edoal/1.0/ (usual prefix: edoal). EDOAL vocabulary is dereferenceable (see below).

Alignment format

An EDOAL alignment is an alignment as specified by the Alignment format. It is identified by its level which must be "2EDOAL". This tells tools that the alignment is on level 2, i.e., correspondences are across constructed entities, and that the corresponding entities are specified according to the expressive language. This ensures the compatibility with other extensions of the format. The alignment moreover specifies the two aligned ontologies, and as exemplified in the code below.

RDF/XML Syntax
<?xml version='1.0' encoding='utf-8' standalone='no'?> <rdf:RDF xmlns='http://knowledgeweb.semanticweb.org/heterogeneity/alignment#' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:xsd='http://www.w3.org/2001/XMLSchema#' xmlns:align='http://knowledgeweb.semanticweb.org/heterogeneity/alignment#' xmlns:edoal='http://ns.inria.org/edoal/1.0/'> <align:Alignment> <align:xml>yes</align:xml> <align:level>2EDOAL</align:level> <align:type>**</align:type> <align:method>fr.inrialpes.exmo.align.impl.method.StringDistAlignment</align:method> <align:time>7</align:time> <align:onto1> <align:Ontology rdf:about="http://www.example.org/ontology1"> <align:location>file:examples/rdf/onto1.owl</align:location> <align:formalism> <align:Formalism align:name="OWL1.0" align:uri="http://www.w3.org/2002/07/owl#" /> </align:formalism> </align:Ontology> </align:onto1> <align:onto2> <align:Ontology rdf:about="http://www.example.org/ontology2"> <align:location>file:examples/rdf/onto2.owl</align:location> <align:formalism> <align:Formalism align:name="OWL1.0" align:uri="http://www.w3.org/2002/07/owl#" /> </align:formalism> </align:Ontology> </align:onto2> ...

Details on each property are available on the Alignment format page.

An alignment contains a set of correspondences (Cells). Each cell can be linked to an alignment using the map property.

RDF/XML Syntax
... <align:map> <align:Cell> <align:entity1><edoal:Class rdf:about="http://www.example.org/ontology1#entity1" /></align:entity1> <align:entity2><edoal:Class rdf:about="http://www.example.org/ontology2#entity2" /></align:entity2> <align:relation>=</align:relation> <align:measure rdf:datatype="&xsd;float">1.0</align:measure> <edoal:transformation>...</edoal:transformation> <edoal:linkkey>...</edoal:linkkey> </align:Cell> </align:map> ...

A Cell can only have one entity1, entity2, relation and measure property, though it may have several transformation and linkkey properties.

corresp ::= <Cell {rdf:about=" URI "} /> <entity1> entity </entity1> <entity2> entity </entity2> <relation> STRING </relation> <measure> STRING </measure> (<transformation> transformation </transformation>)* (<linkkey> linkkey </linkkey>)* </Cell>

As the example shows, the EDOAL vocabulary only appears within the "entity" properties and very specificaly in the edoal:transformation and edoal:linkkey properties.

The correspondence between the two entities could have been expressed in the simple Alignment format because these have named entities identified by a URI. However, the correspondence provides more information because it tells that these entities are Classes.

The strength of EDOAL is to express more complex entities which are described below.

Entities

A quick overview of the implemented EDOAL API is provided here (abstract classes are in bold and interfaces in italics):

EDOALAlignment extends BasicAlignment
EDOALCell extends BasicCell
Expression
|- ClassExpression
|  |- ClassId implements Id
|  |- ClassConstruction
|  |- ClassRestriction
|     |- ClassDomainRestriction
|     |- ClassOccurenceRestriction
|     |- ClassTypeRestriction
|     |- ClassValueRestriction
|- PathExpression implements ValueExpression
|  |- PropertyExpression
|  |  |- PropertyId implements Id
|  |  |- PropertyConstruction
|  |  |- PropertyRestriction
|  |     |- PropertyDomainRestriction
|  |     |- PropertyTypeRestriction
|  |     |- PropertyValueRestriction
|  |- RelationExpression
|     |- RelationId implements Id
|     |- RelationConstruction
|     |- RelationRestriction
|        |- RelationCoDomainRestriction
|        |- RelationDomainRestriction
|- InstanceExpression implements ValueExpression
   |- InstanceId implements Id
Value implements ValueExpression
Apply implements ValueExpression
Aggregate implements ValueExpression
Transformation
Linkkey
Equals
Intersects
Variable
Comparator
Datatype

The Id interface is implemented by expressions identified by an URI: these are the named entities of ontologies that may be used in basic URIAlignments. The ValueExpression is implemented by expressions that identify in context a particular value or instance. This can be an instance or a literal as well as a path expression that leads to that value in the context of an instance.

Hence, the entities that can be found in cells are:

entity ::= instexpr | classexpr | attexpr attexpr ::= propexpr | relexpr
Below are the syntactic declaration of these entities.

Class expressions

Class entities can be constructed using one of the three operators and, or, not.

A class can also be identified by using its URI or defined through a restriction. There are four types of class restrictions: These four types of restrictions restrict the scope of a class expression by applying a restriction to the value, type or cardinality of a particular property or relation. Restrictions are defined by giving an path expression (relation or property), a comparator defining the relation to a value.

classexpr ::= <Class rdf:about=" URI "/> | <Class> classconst </Class> | <AttributeOccurenceRestriction> onatt comp <value><Literal edoal:type="&xsd;integer" edoal:string="INTEGER" /></value> </AttributeOccurenceRestriction> | <AttributeDomainRestriction> onatt classrest </AttributeDomainRestriction> | <AttributeTypeRestriction> onatt typerest </AttributeTypeRestriction> | <AttributeValueRestriction> onatt comp val </AttributeValueRestriction> classconst ::= <and rdf:parseType="Collection"> classexpr* </and> | <or rdf:parseType="Collection"> classexpr* </or> | <not> classexpr </not>

This grammar relies on base values described in the following table:

onatt ::= <onAttribute> attexpr </onAttribute> typerest ::= <datatype> type </datatype> type ::= <Datatype rdf:about=" URI " /> classrest ::= <class> classexpr </class> comp ::= <comparator rdf:resource=" URI "/>

Comparators have to be defined as specific URI, usually in the edoal namespace. They are currently described by: edoal:equals, edoal:lower-than, edoal:greater-than, the latter morally corresponding to the op:numeric-less-than and op:numeric-greater-than from the XQuery 1.0 and XPath 2.0 Functions and Operators recommendation.

Hence, a class expression may be an identified class:
RDF/XML Syntax
<Class rdf:about="&wine;WineFlavor" />
a disjunction or class expressions:
RDF/XML Syntax
<Class> <or rdf:parseType="Collection"> <Class rdf:about="&vin;Acidite" /> <Class rdf:about="&vin;Astreingence" /> <Class rdf:about="&vin;Amertume" /> </or> </Class>
Thanks to paths and restrictions, it is possible to restrict a correspondence to ``Wines whose producing region is located in Aquitaine'' using the following restriction:
RDF/XML Syntax
<Class> <and rdf:parseType="Collection"> <Class rdf:about="&vin;Wine" /> <AttributeValueRestriction> <onAttribute> <Property> <compose rdf:parseType="Collection"> <Relation rdf:about="&vin;hasTerroir" /> <Property rdf:about="&proton;name" edoal:lang="fr" /> </compose> </Property> </onAttribute> <comparator rdf:resource="&edoal;equals" /> <value><Literal edoal:type="&xsd;string" edoal:string="Acquitaine"/></value> </AttributeValueRestriction> </and> </Class>

Note that and and or can take no argument. This may be useful in some circumstances. They are interpreted as follows:

Property expressions

Properties correspond to data properties in OWL. Properties entities can be constructed using one of the operators and, or, not and compose:

A property can also be identified by using its URI or defined through a restriction. There are three classes of property restrictions:

propexpr ::= <Property rdf:about=" URI " {edoal:lang=" LANG "}/> | <Property> propconst+ </Property> | <PropertyDomainRestriction> <class> classexpr </class> </PropertyDomainRestriction> | <PropertyTypeRestriction> typerest </PropertyTypeRestriction> | <PropertyValueRestriction> comp val </PropertyValueRestriction> propconst ::= <and rdf:parseType="Collection"> propexpr+ </and> | <or rdf:parseType="Collection"> propexpr+ </or> | <not> propexpr </not> | <compose> relexpr* propexpr </compose>
As previously properties can be identified by its URI:
RDF/XML Syntax
<Property rdf:about="&wine;hasVintageYear" />
But it may also be restricted by a language tag:
RDF/XML Syntax
<Property rdf:about="&proton;name" edoal:lang="fr" />
As previously properties can be assembled by boolean connectors:
RDF/XML Syntax
<Property> <and rdf:parseType="Collection"> <Property rdf:about="&vin;propriétaire" /> <Property rdf:about="&vin;négociant" /> </and> </Property>
but they can be obtained through a path, i.e., a sequence of relations ending by a property:
RDF/XML Syntax
<Property> <compose rdf:parseType="Collection"> <Relation rdf:about="&vin;hasTerroir" /> <Property rdf:about="&proton;name" /> </compose> </Property>
RDF/XML Syntax
<PropertyTypeRestriction> <datatype> <Datatype rdf:about="&xsd;integer" /> </datatype> </PropertyTypeRestriction>

Relation expressions

Relations correspond to object properties in OWL. Relation expressions can be constructed using one of the operators and, or, not and compose as well as "closure" operator inverse, symmetric, transitive and reflexive:

A relation can also be identified by using its URI or defined through a restriction. There are two classes of relation restrictions:

Their syntax is the following:

relexpr ::= <Relation rdf:about=" URI "/> | <Relation> relconst+ </Relation> | <RelationDomainRestriction> <class> classexpr </class> </RelationDomainRestriction> | <RelationCoDomainRestriction> <class> classexpr </class> </RelationCoDomainRestriction> relconst ::= <and rdf:parseType="Collection"> relexpr+ </and> | <or rdf:parseType="Collection"> relexpr+ </or> | <not> relexpr </not> | <compose> relexpr* </compose> | <inverse> relexpr </inverse> | <symmetric> relexpr </symmetric> | <transitive> relexpr </transitive> | <reflexive> relexpr </reflexive>

Domain restriction is exemplified in the following correspondence with relation expression:
RDF/XML Syntax
<align:Cell> <align:entity1> <Relation> <and rdf:parseType="Collection"> <Relation rdf:about="&wine;locatedIn" /> <RelationDomainRestriction> <class><Class rdf:about="&wine;Wine" /></class> </RelationDomainRestriction> </Relation> </and> </Relation> </align:entity1> <align:entity2> <Relation rdf:about="&vin;hasTerroir" /> </align:entity2> <align:measure rdf:datatype="&xsd;float">1.0</align:measure> <align:relation>&lt;</align:relation> </align:Cell>
An example of occurrence restriction would be the wines produced in a region with no adjacent region, such as an island. For instance Moscatel Madeira wine is produced on the island of Madeira.
RDF/XML Syntax
<align:Cell> <align:entity1> <Class> <and rdf:parseType="Collection"> <Class rdf:about="&wine;Wine" /> <AttributeOccurrenceRestriction> <onAttribute> <Relation> <compose rdf:parseType="Collection"> <Relation rdf:about="&wine;hasTerroir" /> <Relation rdf:about="&wine;adjacentRegion" /> </compose> </Relation> </onAttribute> <comparator rdf:resource="&edoal;greater-than" /> <value><Literal edoal:type="&xsd;integer" edoal:string="0"/></value> </AttributeOccurrenceRestriction> </and> </Class> </align:entity1> <align:entity2> <Class rdf:about="&vin;Madere" /> </align:entity2> <align:measure rdf:datatype="&xsd;float">1.0</align:measure> <align:relation>></align:relation> </align:Cell>
Another example uses a path to state that a locally grown wine is a wine whose owner (propriétaire) is the same person as the first seller (négociant) for this wine.
RDF/XML Syntax
<align:Cell> <align:entity1> <Class rdf:about="&wine;LocallyGrownWine" /> </align:entity1> <align:entity2> <Class> <and rdf:parseType="Collection"> <Class rdf:about="&vin;Vin" /> <AttributeValueRestriction> <onAttribute> <Relation rdf:about="&vin;propriétaire" /> </onAttribute> <comparator rdf:resource="&edoal;equals" /> <value><Relation rdf:about="&vin;négotiant" /></value> </AttributeValueRestriction> </and> </Class> </align:entity2> <align:measure rdf:datatype="&xsd;float">1.0</align:measure> <align:relation>></align:relation> </align:Cell>

Note that compose may take no argument in case of relations. This may be useful in some circumstances. <compose rdf:parseType="Collection"/> is equivalent to the identity relation, hence when applied to an object has for unique value the object itself (it is the equivalent self or this in some languages).

Value expressions

A value expression may be used in alignments for denoting an individual things (not a class, a property or a relations). These values may be:

They obey the following grammar:

val ::= <value> value </value> value ::= <Literal {edoal:type=" URI "} {edoal:lang=" LANG "} edoal:string=" STRING " /> | instexpr | attrexpr | <Apply edoal:operator=" URI "> <arguments rdf:parseType="Collection">value*</arguments> </Apply> | <Aggregate edoal:operator=" URI "> <arguments rdf:parseType="Collection">value*</arguments> </Aggregate> instexpr ::= <Instance rdf:about=" URI "/>

Literal values:
RDF/XML Syntax
<Literal edoal:type="&xsd;integer" edoal:string="123" /> <Literal edoal:lang="fr" edoal:string="Administration" />

Instances are always single entities refering to an individual through its URI:

RDF/XML Syntax
<Instance rdf:about="&vin;hasTerroir" />

Application of an operator may be expressed in the following way:
RDF/XML Syntax
<Apply edoal:operator="http://example.com/Whatever"> <arguments rdf:parseType="Collection"> <Literal edoal:type="&xsd;integer" edoal:string="123" /> <Property> <compose rdf:parseType="Collection"> <Relation rdf:about="&vin;hasTerroir" /> <Property rdf:about="&proton;localedIn" /> </compose> </Property> <Instance rdf:about="&vin;Bordelais" /> </arguments> </Apply>

Aggregagtion of a set of values may be defined by (sum the weights of components):
RDF/XML Syntax
<Aggregate edoal:operator="&fn;sum"> <arguments rdf:parseType="Collection"> <Property> <compose rdf:parseType="Collection"> <Property rdf:about="&O1;component" /> <Property rdf:about="&O1;weight" /> </compose> </Property> </arguments> </Aggregate>

The actual implementation of the edoal:operator values is out of the scope of EDOAL. URIs to use as the operator attribute of Apply (and Aggregate) are not specified. Depending on the use of the alignments, operators may be implemented in various way. In order to provide a useful and portable way to express operations, EDOAL promotes the use of the following conventions:

XPath functions (fn:name, op:name and xs:type)
Operators from the XQuery and XPath Functions and Operators (3.1) recommendation. This is the recommended way to identify functions because they have URIs and the XPath library is already quite large. (fn: prefix used for http://www.w3.org/2005/xpath-functions and op prefix used as a convention and does not corresponds to a URI prefix! In addition, the xs: prefix for http://www.w3.org/2001/XMLSchema is used for type coercion as with the "as" operation)
SPIN function (sp:name)
It would be convenient to use standard SPIN functions as well. However, SPIN functions are usually declared in another namespace, e.g., qodtspin, so they may not be usable here (sp: prefix used for http://spinrdf.org/sp? spin for http://spinrdf.org/spin#?)
Web service (http://service prefix)
It should be possible to call a web service (but for this to work parameters should be named and not just listed)
Java (static) method (java:fully qualified class name#method name)
The fully qualified name of a Java method, e.g., java.net.URI#toString, may be used referring to a Java implementation (it can be from any namespace).
Otherwise (uri)
Any URI is possible but its interpretation is undefined.

EDOAL could have come with yet another standard set of built-in functions, but we decided to refrain from introducing it and prefer to rely on more standard efforts.

Transformations

Transformations are expressed in the cell itself. Transformations do not express constraints on the classes or properties, but constraints on instances that should match.

transformation ::= <Transformation edoal:direction=" STRING "> <entity1> value </entity1> <entity2> value </entity2> </Transformation> with STRING ::= 'o-' | '-o'

Transformations can be invoked, for example for dynamic transformations like currency conversions (see examples).

The following correspondence shows an example of the use of data transformation:
RDF/XML Syntax
<transformation> <Transformation edoal:direction="o-"> <entity1> <Property><compose rdf:parseType="Collection"/></Property> </entity1> <entity2> <Apply edoal:operator="concat"> <arguments rdf:parseType="Collection"> <Property rdf:about="vcard:firstname" /> <Literal edoal:type="&xsd;string" edoal:string=" " /> <!-- or even compute middle initial from middlename --> <Property rdf:about="vcard:middleinitial" /> <Literal edoal:string=". " /> <Property rdf:about="vcard:lastname" /> </arguments> </Apply> </entity2> </Transformation> </transformation>

Linkkeys

Linkkeys which are a generalisation to several data sets of keys in relational databases. A linkkey is a statement such as:

( {⟨p1, q1⟩,... ⟨pn,qn⟩}{⟨p'1, q'1⟩,... ⟨p'm,q'm⟩} linkkey ⟨c, d⟩ )
stating that whatever an instance of the class c has the same values for properties p1,... pn as an instance of class d has for properties q1,... qn and that their values for respectively p'1,... p'm and q'1,... q'm instersect pairwise, then these two are the same entity.

Such keys are slightly more complex than in databases because in RDF properties are not necessarily functional (they may have several values) and their values may be other objects. For this reason, it is necessary to indicate if it is required that all values must be the same (Equals) or if some of them must instersect (Intersects).

linkkey ::= <Linkkey> (<binding> bindspec <binding/>)* </Linkkey> bindspec ::= <Equals> <property1> attexpr </property1> <property2> attexpr </property2> </Equals> | <Intersects> <property1> attexpr </property1> <property2> attexpr </property2> </Intersects>

Linkkeys are primarily used for identifying identical objects. For instance, it may be that a instance of the Livre class is equivalent to an instance of the Novel class as soon as their properties auteur and titre on the one side and creator and title on the other side have the same values. This is expressed in the following example:

RDF/XML Syntax
<align:Cell rdf:about="#cell-with-linkkey"> <align:entity1><Class rdf:about="Livre" /></align:entity1> <align:entity2><Class rdf:about="Novel" /></align:entity2> <align:relation>=</align:relation> <linkkey> <Linkkey> <lk:type>plain</lk:type> <binding> <Intersects> <property1><Relation rdf:about="auteur" /></property1> <property2><Relation rdf:about="creator" /></property2> </Intersects> </binding> <binding> <Equals> <property1><Property rdf:about="titre" /></property1> <property2><Property rdf:about="title" /></property2> </Equals> </binding> </Linkkey> </linkkey> </align:Cell>

It is then possible to identify duplicates or to generate owl:sameAs links.

EDOAL Patterns

EDOAL also contains a pattern language with allows for expressing generalised correspondences in which entities can be abstract. This language is not very different from EDOAL (beside its introduction of variables which are already present in the previous example).

It will be documented at a later stage. Contact us if you need such a language or have an idea of what it should do.

The following correspondence pattern uses three variables. var3 is a property variable representing a property having in its domain the class identified by the variable var1. Moreover, the property var3 has an integer value. This pattern thus captures all correspondences between two classes, the scope of one class being restricted to only those instances having a specific value (not specified by the pattern) for one of its property whith datatype "integer".

RDF/XML Syntax
<align:Cell rdf:about="#Cell1"> <align:entity1> <Class> <and rdf:parseType="Collection"> <Class edoal:var="#var1" /> <AttributeTypeRestriction> <onAttribute> <PropertyDomainRestriction edoal:var="#var3"> <class> <Class edoal:var="#var1" /> </class> </PropertyDomainRestriction> </onAttribute> <datatype><Datatype rdf:about="&xsd;integer" /></datatype> </AttributeTypeRestriction> </and> </Class> </align:entity1> <align:entity2> <Class edoal:var="#var2" /> </align:entity2> <align:relation>=</align:relation> </align:Cell>

Longer examples

Various examples are in the alignment files found in the "examples/omwg" directory of the Alignment API release zip.

The following examples illustrate various kids of usage of the vocabulary.

Class partition

This example shows how to express a correspondence between a class in one ontology corresponding to a set of classes in the other ontology. In order to graps the precise correspondence, the one class is partitioned according to the value of one of its attributes. In this example one ontology has a class LED which has a property color, while the other ontology has three classes RedLED, BlueLED, and GreenLED. The LED class is aligned with the three corresponding classes by specifying a restriction of its scope to the corresponding value of the color attribute.

RDF/XML Syntax
<align:Cell rdf:about="#cell1"> <align:entity1> <Class> <and rdf:parseType="Collection"> <Class rdf:about="&O1;LED" /> <AttributeValueRestriction> <onAttribute> <Relation rdf:about="&O1;hasColor" /> </onAttribute> <comparator rdf:resource="&edoal;equals" /> <value><Instance rdf:about="&O1;Blue" /></value> </AttributeValueRestriction> </and> </Class> </align:entity1> <align:entity2><Class rdf:about="&O2;BlueLED" /></align:entity2> <align:relation>=</align:relation> </align:Cell> <align:Cell rdf:about="#cell2"> <align:entity1> <Class> <and rdf:parseType="Collection"> <Class rdf:about="&O1;LED" /> <AttributeValueRestriction> <onAttribute> <Relation rdf:about="&O1;hasColor" /> </onAttribute> <comparator rdf:resource="&edoal;equals" /> <value><Instance rdf:about="&O1;Red" /></value> </AttributeValueRestriction> </and> </Class> </align:entity1> <align:entity2><Class rdf:about="&O2;RedLED" /></align:entity2> <align:relation>=</align:relation> </align:Cell> <align:Cell rdf:about="#cell3"> <align:entity1> <Class> <and rdf:parseType="Collection"> <Class rdf:about="&O1;LED" /> <AttributeValueRestriction> <onAttribute> <Relation rdf:about="&O1;hasColor" /> </onAttribute> <comparator rdf:resource="&edoal;equals" /> <value><Instance rdf:about="&O1;Green" /></value> </AttributeValueRestriction> </and> </Class> </align:entity1> <align:entity2><Class rdf:about="&O2;GreenLED" /></align:entity2> <align:relation>=</align:relation> </align:Cell>

Class equivalence by restricting values

This example expresses that any INSEE Département (French administrative circunscription) is a NUTS region of level 2 situated in France (note the use of composition for reaching FR).

RDF/XML Syntax
<align:Cell> <align:entity1><Class rdf:about="&insee;Département" /></align:entity1> <align:entity2> <Class> <and rdf:parseType="Collection"> <Class rdf:about="&nuts;Region" /> <AttributeValueRestriction> <onAttribute> <Relation> <compose rdf:parseType="Collection"> <Relation rdf:about="&nuts;hasParentRegion" /> <Relation rdf:about="&nuts;hasParentRegion" /> </compose> </Relation> </onAttribute> <comparator rdf:resource="&edoal;equals" /> <value><Instance rdf:about="&nuts;FR" /></value> </AttributeValueRestriction> <AttributeValueRestriction> <onAttribute> <Property rdf:about="&nuts;level" /> </onAttribute> <comparator rdf:resource="&edoal;equals" /> <value><Literal edoal:type="&xsd;int" edoal:string="2"/></value> </AttributeValueRestriction> </and> </Class> </align:entity2> <align:relation>=</align:relation> </align:Cell>

Equivalence between a relation and a class

In this example, instances of the class "Connection" are equivalent to the relation "connectedWith". The definition of the correspondence allows to transform immediately one into the other and vice-verse because the first part is defined as a relation.

RDF/XML Syntax
<align:map> <align:Cell rdf:about="#M6"> <align:entity1> <Relation> <compose rdf:parseType="Collection"> <Relation> <inverse> <Relation rdf:about="&O1;sourceComponent" /> </inverse> </Relation> <Relation> <and rdf:parseType="Collection"> <Relation rdf:about="&O1;targetComponent" /> <RelationDomainRestriction> <class> <Class rdf:about="&O1;Connection" /> </class> </RelationDomainRestriction> </and> </Relation> </compose> </Relation> </align:entity1> <align:entity2><Relation rdf:about="&O1;connectedWith" /></align:entity2> <align:relation>=</align:relation> <align:measure rdf:datatype="&xsd;float">1.0</align:measure> </align:Cell> </align:map>

Extensive use of data transformations

This example shows two classes which are trivially equivalent but which needs a lot of transformations to convert one instance into another.

  1. The value of hasLeader is obtained by applying regular expression substitution on the full name of the leader;
  2. The firstname and lastname of the leader is obtained by manipulating the value of hasLeader (in the first case through XPath function, in the second case through an imaginary non portable Java function. Note that these operations go in the opposite directions as the former one and allows for complementary transformations;
  3. The duration is obtained by subtracting start date from end date (unsing a standard XPath operation);
  4. The load is obtained by summing the manpower required by each subtask;
  5. The cost is obtained by calling an external service providing currency convertion.

This example illustrates the conversion between two currencies. A transformation service is specified.

RDF/XML Syntax
<align:map> <align:Cell rdf:about="#M11b"> <align:entity1><Class rdf:about="&O1;Activity" /></align:entity1> <align:entity2><Class rdf:about="&O2;Project" /></align:entity2> <align:relation>=</align:relation> <align:measure rdf:datatype="&xsd;float">1.0</align:measure> <transformation> <Transformation edoal:direction="-o"> <entity1> <Property rdf:about="&O1;hasLeader" /> </entity1> <entity2> <Apply edoal:operator="&fn;replace"> <arguments rdf:parseType="Collection"> <Property> <compose rdf:parseType="Collection"> <Relation rdf:about="&O2;leader" /> <Property rdf:about="&O2;fullname" /> </compose> </Property> <Literal edoal:string="(.*) ([^ ]*)" /> <Literal edoal:string="$2, $1" /> </arguments> </Apply> </entity2> </Transformation> </transformation> <transformation> <Transformation edoal:direction="o-"> <entity1> <Apply edoal:operator="&fn;substring-after"> <arguments rdf:parseType="Collection"> <Property rdf:about="&O1;hasLeader" /> <Literal edoal:string=", " /> </arguments> </Apply> </entity1> <entity2> <Property> <compose rdf:parseType="Collection"> <Relation rdf:about="&O2;leader" /> <Property rdf:about="&O2;firstname" /> </compose> </Property> </entity2> </Transformation> </transformation> <transformation> <Transformation edoal:direction="o-"> <entity1> <Apply edoal:operator="java:java.lang.String#substringBefore"> <arguments rdf:parseType="Collection"> <Property rdf:about="&O1;hasLeader" /> <Literal edoal:string=", " /> </arguments> </Apply> </entity1> <entity2> <Property> <compose rdf:parseType="Collection"> <Relation rdf:about="&O2;leader" /> <Property rdf:about="&O2;lastname" /> </compose> </Property> </entity2> </Transformation> </transformation> <transformation> <Transformation edoal:direction="o-"> <entity1> <Apply edoal:operator="op:subtract-dates"> <arguments rdf:parseType="Collection"> <Property rdf:about="&O1;hasEndDate" /> <Property rdf:about="&O1;hasStartingDate" /> </arguments> </Apply> </entity1> <entity2> <Property rdf:about="&O2;duration" /> </entity2> </Transformation> </transformation> <transformation> <Transformation edoal:direction="-o"> <entity1> <Aggregate edoal:operator="&fn;sum"> <arguments rdf:parseType="Collection"> <Property> <compose rdf:parseType="Collection"> <Relation rdf:about="&O1;subTask" /> <Property rdf:about="&O1;manpower" /> </compose> </Property> </arguments> </Aggregate> </entity1> <entity2> <Property rdf:about="&O2;load" /> </entity2> </Transformation> </transformation> <transformation> <Transformation edoal:direction="o-"> <entity1> <Property rdf:about="&O1;cost" /> </entity1> <entity2> <Apply edoal:operator="https://www.google.com/finance/converter"> <arguments rdf:parseType="Collection"> <Property rdf:about="&O2;hasPrice" /> <Literal edoal:string="EUR" /> <Literal edoal:string="CNY" /> </arguments> </Apply> </entity2> </Transformation> </transformation> </align:Cell> </align:map>

Dereferenceable vocabulary (Please: XHTML+RDFa)

Due to popular demand, here is the derefenceable version of the RDF vocabulary used in the format. Official URI is http://ns.inria.org/edoal/1.0/.

Beware, that EDOAL has been designed as a format and an API rather than a generic RDF vocabulary. A natural ontology would be closer to the API but would give a more verbose EDOAL format. The EDOAL format is in RDF and compact. In consequence, not any RDF graph using the EDOAL vocabulary is a well-defined EDOAL alignment. In particular, RDF can express incomplete knowledge while the EDOAL API requires complete knowledge of the alignment.

Class: Value

This is an abstract class, never instantiated in the format.

URI
http://ns.inria.org/edoal/1.0/#Value
subclasses
Literal, Instance, Attribute, Apply, Aggregate

Class: Literal

URI
http://ns.inria.org/edoal/1.0/#Literal
superclasses
Value
properties
type, string

Property: type

URI
http://ns.inria.org/edoal/1.0/#type
domain
Literal
range
Datatype

Property: string

URI
http://ns.inria.org/edoal/1.0/#string
domain
Literal
range
String

Class: Apply

URI
http://ns.inria.org/edoal/1.0/#Apply
superclasses
Value
properties
operator, arguments

Class: Aggregate

URI
http://ns.inria.org/edoal/1.0/#Aggregate
superclasses
Value
properties
operator, arguments

Property: operator

The name of the operator to apply.

URI
http://ns.inria.org/edoal/1.0/#operator
domain
Apply,Aggregate
range
URI
see also
Value expression

Property: arguments

URI
http://ns.inria.org/edoal/1.0/#argument
domain
Apply,Aggregate
range
Sequence(Value)

Class: Datatype

URI
http://ns.inria.org/edoal/1.0/#Datatype

Class: Class

URI
http://ns.inria.org/edoal/1.0/#Class
properties
and, or, not
subclasses
AttributeRestriction

Class: AttributeRestriction

This is an abstract class, never instantiated in the format.

URI
http://ns.inria.org/edoal/1.0/#AttributeRestriction
superclasses
Class
properties
onAttribute

Class: AttributeOccurenceRestriction

URI
http://ns.inria.org/edoal/1.0/#AttributeOccurenceRestriction
superclasses
AttributeRestriction
properties
(onAttribute), comparator, value

Class: AttributeDomainRestriction

URI
http://ns.inria.org/edoal/1.0/#AttributeDomainRestriction
superclasses
AttributeRestriction
properties
(onAttribute), class, all, exists

Class: AttributeTypeRestriction

URI
http://ns.inria.org/edoal/1.0/#AttributeTypeRestriction
superclasses
AttributeRestriction
properties
(onAttribute), datatype,

Class: AttributeValueRestriction

URI
http://ns.inria.org/edoal/1.0/#AttributeValueRestriction
superclasses
AttributeRestriction
properties
(onAttribute), comparator, value

Property: onAttribute

URI
http://ns.inria.org/edoal/1.0/#onAttribute
domain
ClassRestriction
range
Attribute

Property: class

URI
http://ns.inria.org/edoal/1.0/#class
domain
AttributeClassRestriction, PropertyDomainRestriction, RelationDomainRestriction, RelationCoDomainRestriction
range
Class

Property: all

URI
http://ns.inria.org/edoal/1.0/#all
domain
AttributeClassRestriction
range
Class

Property: exists

URI
http://ns.inria.org/edoal/1.0/#exists
domain
AttributeClassRestriction
range
Class

Property: datatype

URI
http://ns.inria.org/edoal/1.0/#datatype
domain
AttributeTypeRestriction, PropertyTypeRestriction
range
Datatype

Property: comparator

URI
http://ns.inria.org/edoal/1.0/#comparator
domain
AttributeValueRestriction, AttributeOccurenceRestriction, PropertyValueRestriction
range
Comparator

Property: value

URI
http://ns.inria.org/edoal/1.0/#value
domain
AttributeValueRestriction, AttributeOccurenceRestriction, PropertyValueRestriction
range
Value

Property: and

URI
http://ns.inria.org/edoal/1.0/#and
domain
Class, Property, Relation
range
Class, Property, Relation

Property: or

URI
http://ns.inria.org/edoal/1.0/#or
domain
Class, Property, Relation
range
Class, Property, Relation

Property: not

URI
http://ns.inria.org/edoal/1.0/#not
domain
Class, Property, Relation
range
Class, Property, Relation

Property: compose

URI
http://ns.inria.org/edoal/1.0/#compose
domain
Attribute
range
Attribute

Property: inverse

URI
http://ns.inria.org/edoal/1.0/#inverse
domain
Relation
range
Relation

Property: reflexive

URI
http://ns.inria.org/edoal/1.0/#reflexive
domain
Relation
range
Relation

Property: transitive

URI
http://ns.inria.org/edoal/1.0/#transitive
domain
Relation
range
Relation

Property: symmetric

URI
http://ns.inria.org/edoal/1.0/#symmetric
domain
Relation
range
Relation

Class: Attribute

This is an abstract class, never instantiated in the format.

URI
http://ns.inria.org/edoal/1.0/#Attribute
superclasses
Value
properties
and, or, not, compose
subclasses
Relation, Property

Class: Property

URI
http://ns.inria.org/edoal/1.0/#Property,
superclasses
Attribute
properties
(and, or, not, compose)
subclasses
PropertyDomainRestriction, PropertyTypeRestriction, PropertyValueRestriction
see also
the property section

Class: PropertyDomainRestriction

URI
http://ns.inria.org/edoal/1.0/#PropertyDomainRestriction
superclasses
Property
properties
class

Class: PropertyTypeRestriction

URI
http://ns.inria.org/edoal/1.0/#PropertyTypeRestriction
superclasses
Property
properties
datatype

Class: PropertyValueRestriction

URI
http://ns.inria.org/edoal/1.0/#PropertyValueRestriction
superclasses
Property
properties
comparator, value

Class: Relation

URI
http://ns.inria.org/edoal/1.0/#RelationExpression
superclasses
Attribute
properties
(and, or, not, compose), inverse, reflexive, symmetric, transitive
subclasses
RelationRestriction
see also
Relation section

Class: RelationRestriction

URI
http://ns.inria.org/edoal/1.0/#RelationRestriction
superclasses
Relation
properties
class
subclasses
RelationCoDomainRestriction, RelationCoDomainRestriction

Class: RelationCoDomainRestriction

URI
http://ns.inria.org/edoal/1.0/#RelationCoDomainRestriction
properties
(class)
superclasses
RelationRestriction

Class: RelationDomainRestriction

URI
http://ns.inria.org/edoal/1.0/#RelationDomainRestriction
properties
(class)
superclasses
RelationRestriction

Class: Instance

URI
http://ns.inria.org/edoal/1.0/#Instance
superclasses
Value
see also
Instance section

Class: Transformation

URI
http://ns.inria.org/edoal/1.1/#Transformation
properties
direction, entity1, entity2 (value restricted to Value)
see also
Transformation section

Property: direction

The orientation of a transformation.

URI
http://ns.inria.org/edoal/1.0/#direction
domain
Transformation
range
String: o-, -o or oo
see also
Transformation section

Relation: entity1, entity2

Not to be confounded with align:entityX, this is edoal:entityX.

URI
http://ns.inria.org/edoal/1.0/#entity1, http://ns.inria.org/edoal/1.0/#entity2
domain
Transformation
range
Value
see also
Transformation section

Class: Linkkey

URI
http://ns.inria.org/edoal/1.0/#Linkkey
properties
binding
see also
Linkkey section

Relation: binding

URI
http://ns.inria.org/edoal/1.0/#binding
domain
Linkkey
range
Equals, Intersects
see also
Linkkey section

Class: Equals

URI
http://ns.inria.org/edoal/1.0/#Equals
properties
property1, property2
see also
Linkkey section

Class: Intersects

URI
http://ns.inria.org/edoal/1.0/#Intersects
properties
property1, property2
see also
Linkkey section

Relation: property1, property2

URI
http://ns.inria.org/edoal/1.0/#property1, http://ns.inria.org/edoal/1.0/#property2
domain
Equals, Intersects
range
Attribute
see also
Linkkey section

Class: Comparator

URI
http://ns.inria.org/edoal/1.0/#Comparator

Deprecated Class: Operator

URI
http://ns.inria.org/edoal/1.0/#Operator

Not yet declared:

Variable

History

This language has been first designed by François Scharffe as the SEKT Mapping language. It then became the OMWG Ontology Mapping language developed under the Sourceforge mappingapi project (http://sourceforge.net/projects/mediation/). This language was further described by François Scharffe, Jérôme Euzenat and Antoine Zimmermann in Knowledge web deliverable 2.2.10, in particular through the semantics of the language. Its implementation was also reengineered as an extension of the Alignment format so that it could be manipulated through the Alignment API tools (starting version 3.1).

It has now been redesigned and reimplemented under the name of EDOAL. It is a plain component of the Alignment API and is maintained together with it.

The linkkey idea has been promoted by Jérôme Euzenat, further refined with Jérôme David and Manuel Atencia and finally implemented in the Alignment API (version 4.7) by Nicolas Guillouet.

Thanks

Thanks to Jonathan Snook and Robert Nyman for the syntax toggling scripts borrowed from the OWL Recommendation web page. http://www.robertnyman.com/2005/11/07/the-ultimate-getelementsbyclassname/.

Thanks to Alex Stolz for his very useful RDF Translator.


https://moex.gitlabpages.inria.fr/alignapi/edoal.html