Mentions légales du service

Skip to content
Snippets Groups Projects
Commit 7eee61de authored by Jérôme Euzenat's avatar Jérôme Euzenat
Browse files

- Added Aggregate transformation to EDOAL (edoal)

parent bf767a0d
No related branches found
No related tags found
No related merge requests found
......@@ -104,7 +104,7 @@ 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 <a href="format.html">alignment format</a>.</p>
the <a href="format.html">Alignment format</a>.</p>
<!--dl>
<dt><a href="#sec:purpose">Purpose</a></dt>
......@@ -128,11 +128,11 @@ the <a href="format.html">alignment format</a>.</p>
</pre>
</div-->
<p>Representing ontology alignments is the general purpose of this vocabulary. Particularly, it extends the ontology <a href="format.html">alignment format</a> in order to enable the representation of complex correspondences.</p>
<p>Representing ontology alignments is the general purpose of this vocabulary. Particularly, it extends the ontology <a href="format.html">Alignment format</a> in order to enable the representation of complex correspondences.</p>
<p>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.</p>
<p>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.</p>
<p>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.</p>
<h3 id="sec:features">Features</h3>
......@@ -170,7 +170,7 @@ However, we are glad that you report errors in the other syntaxes as well.
<h2 id="ssec:headers">Alignment and cells</h2>
<p>
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.
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.
</p>
<!--p>
The diagram below shows the vocabulary classes ???
......@@ -179,7 +179,7 @@ The diagram below shows the vocabulary classes ???
</p-->
<p>
While <i>Alignment</i> and <i>Cell</i> are described by the <a href="format.html">alignment format</a>, we will focus here on the remaining classes.</p>
While <i>Alignment</i> and <i>Cell</i> are described by the <a href="format.html">Alignment format</a>, we will focus here on the remaining classes.</p>
<h3 id="ssec:namespaces">Namespaces</h3>
<p>
......@@ -195,7 +195,7 @@ prefix: edoal). EDOAL vocabulary is dereferenceable (see <a href="#deref">below<
<h3 id="ssec:alignment">Alignment format</h3>
<p>
An EDOAL alignment is an alignment as specified by the 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.
......@@ -238,7 +238,7 @@ exemplified in the code below.
...
</div></div>
<p>Details on each property are available on the <a href="format.html">alignment format</a> page.</p>
<p>Details on each property are available on the <a href="format.html">Alignment format</a> page.</p>
<p>An alignment contains a set of correspondences (<tt>Cell</tt>s).
Each cell can be linked to an alignment using the <tt>map</tt> property.
......@@ -310,7 +310,7 @@ EDOALCell extends BasicCell
| |- ClassOccurenceRestriction
| |- ClassTypeRestriction
| |- ClassValueRestriction
|- <b>PathExpression</b> implements <i>ValueExpression</i>
|- <b>PathExpression</b> implements <a href="#ssec:values"><i>ValueExpression</i></a>
| |- <a href="#ssec:properties"><b>PropertyExpression</b></a>
| | |- PropertyId implements <i>Id</i>
| | |- PropertyConstruction
......@@ -324,16 +324,17 @@ EDOALCell extends BasicCell
| |- <b>RelationRestriction</b>
| |- RelationCoDomainRestriction
| |- RelationDomainRestriction
|- <a href="#ssec:instances"><b>InstanceExpression</b></a>
|- <a href="#ssec:instances"><b>InstanceExpression</b></a> implements <a href="#ssec:values"><i>ValueExpression</i></a>
|- InstanceId implements <i>Id</i>
Value implements <i>ValueExpression</i>
Apply implements <i>ValueExpression</i>
Transformation
Linkkey
Value implements <a href="#ssec:values"><i>ValueExpression</i></a>
Apply implements <a href="#ssec:values"><i>ValueExpression</i></a>
Aggregate implements <a href="#ssec:values"><i>ValueExpression</i></a>
<a href="#ssec:transf">Transformation</a>
<a href="#ssec:linkkeys">Linkkey</a>
Equals
Includes
TransfService implements <i>Clonable</i>
<a href="sec:patterns">Variable</a>
Intersects<!--
TransfService implements <i>Clonable</i> -->
<a href="#sec:patterns">Variable</a>
Comparator
Datatype
</pre>
......@@ -712,7 +713,7 @@ circumstances.
or <tt>this</tt> in some languages).
</p>
<h2 id="ssec:values">Values</h2>
<h2 id="ssec:values">Value expressions</h2>
<p>
A value expression may be used in alignments for denoting an
......@@ -735,6 +736,7 @@ They obey the following grammar:
<!-- | &lt;Literal {edoal:type=" <u>URI</u> "}> <u>STRING</u> &lt;/Literal> --> | <u>instexpr</u>
| <u>attrexpr</u>
| &lt;Apply edoal:operator=" <u>URI</u> "> &lt;arguments rdf:parseType="Collection"><u>value</u>*&lt;/arguments> &lt;/Apply>
| &lt;Aggregate edoal:operator=" <u>URI</u> "> &lt;arguments rdf:parseType="Collection"><u>value</u>*&lt;/arguments> &lt;/Aggregate>
<!-- JE: this is unfortunately ugly, otherwise, this is perfect REST--><!--
| &lt;Service edoal:operator=" <u>URI</u> "> &lt;arguments rdf:parseType="Collection"><u>param</u>*&lt;/arguments> &lt;/Service>
......@@ -1283,7 +1285,7 @@ the EDOAL API requires complete knowledge of the alignment.
<p>This is an abstract class, never instantiated in the format.</p>
<dl>
<dt>URI</dt><dd><a href="#Value">http://ns.inria.org/edoal/1.0/#Value</a></dd>
<dt>subclasses</dt><dd><a href="#Literal">Literal</a>, <a href="#Instance">Instance</a>, <a href="#Attribute">Attribute</a>, <a href="#Apply">Apply</a>, </dd>
<dt>subclasses</dt><dd><a href="#Literal">Literal</a>, <a href="#Instance">Instance</a>, <a href="#Attribute">Attribute</a>, <a href="#Apply">Apply</a>, <a href="#Aggregate">Aggregate</a></dd>
</dl></div>
<div class="vocab">
......@@ -1318,19 +1320,29 @@ the EDOAL API requires complete knowledge of the alignment.
<dt>properties</dt><dd><a href="#operator">operator</a>, <a href="#arguments">arguments</a></dd>
</dl></div>
<div class="vocab">
<h3>Class: <a name="Aggregate">Aggregate</a></h3>
<dl>
<dt>URI</dt><dd><a href="#Aggregate">http://ns.inria.org/edoal/1.0/#Aggregate</a></dd>
<dt>superclasses</dt><dd><a href="#Value">Value</a></dd>
<dt>properties</dt><dd><a href="#operator">operator</a>, <a href="#arguments">arguments</a></dd>
</dl></div>
<div class="vocab">
<h3>Property: <a name="operator">operator</a></h3>
<p>The name of the operator to apply.</p>
<dl>
<dt>URI</dt><dd><a href="#operator">http://ns.inria.org/edoal/1.0/#operator</a></dd>
<dt>domain</dt><dd><a href="#Apply">Apply</a></dd>
<dt>range</dt><dd><a href="#Operator">Operator</a></dd>
<dt>domain</dt><dd><a href="#Apply">Apply</a>,<a href="#Aggregate">Aggregate</a></dd>
<dt>range</dt><dd>URI</dd>
<dt>see also</dt><dd><a href="#ssec:values">Value expression</a></dd>
</dl></div>
<div class="vocab">
<h3>Property: <a name="arguments">arguments</a></h3>
<dl>
<dt>URI</dt><dd><a href="#arguments">http://ns.inria.org/edoal/1.0/#argument</a></dd>
<dt>domain</dt><dd><a href="#Apply">Apply</a></dd>
<dt>domain</dt><dd><a href="#Apply">Apply</a>,<a href="#Aggregate">Aggregate</a></dd>
<dt>range</dt><dd>Sequence(<a href="#Value">Value</a>)</dd>
</dl></div>
......@@ -1597,6 +1609,39 @@ the EDOAL API requires complete knowledge of the alignment.
</dl>
</div>
<div class="vocab">
<h3>Class: <a name="Transformation">Transformation</a></h3>
<dl>
<dt>URI</dt><dd><a href="#Transformation">http://ns.inria.org/edoal/1.1/#Transformation</a></dd>
<!--dt>superclasses</dt><dd><a href="#Value">Value</a></dd-->
<dt>properties</dt><dd><a href="#direction">direction</a>, <a href="#entity1">entity1</a>, <a href="#entity2">entity2</a>
(value restricted to <a href="#Value">Value</a>)</dd>
<dt>see also</dt><dd><a href="#ssec:transf">Transformation section</a></dd>
</dl>
</div>
<div class="vocab">
<h3>Property: <a name="direction">direction</a></h3>
<p>The orientation of a transformation.</p>
<dl>
<dt>URI</dt><dd><a href="#direction">http://ns.inria.org/edoal/1.0/#direction</a></dd>
<dt>domain</dt><dd><a href="#Transformation">Transformation</a></dd>
<dt>range</dt><dd>String: o-, -o or oo</dd>
<dt>see also</dt><dd><a href="#ssec:transf">Transformation section</a></dd>
</dl>
</div>
<div class="vocab">
<h3>Relation: <a name="entity1">entity1</a>, <a name="entity2">entity2</a></h3>
<p>Not to be confounded with align:entityX, this is edoal:entityX.</p>
<dl>
<dt>URI</dt><dd><a href="#entity1">http://ns.inria.org/edoal/1.0/#entity1</a>, <a href="#entity2">http://ns.inria.org/edoal/1.0/#entity2</a></dd>
<dt>domain</dt><dd><a href="#Transformation">Transformation</a></dd>
<dt>range</dt><dd><a href="#Value">Value</a></dd>
<dt>see also</dt><dd><a href="#ssec:transf">Transformation section</a></dd>
</dl>
</div>
<div class="vocab">
<h3>Class: <a name="Linkkey">Linkkey</a></h3>
<dl>
......@@ -1637,19 +1682,9 @@ the EDOAL API requires complete knowledge of the alignment.
</div>
<div class="vocab">
<h3>Relation: <a name="property1">property1</a></h3>
<dl>
<dt>URI</dt><dd><a href="#property1">http://ns.inria.org/edoal/1.0/#property1</a></dd>
<dt>domain</dt><dd><a href="#Equals">Equals</a>, <a href="#Intersects">Intersects</a></dd>
<dt>range</dt><dd><a href="#Attribute">Attribute</a></dd>
<dt>see also</dt><dd><a href="#ssec:linkkeys">Linkkey section</a></dd>
</dl>
</div>
<div class="vocab">
<h3>Relation: <a name="property2">property2</a></h3>
<h3>Relation: <a name="property1">property1</a>, <a name="property2">property2</a></h3>
<dl>
<dt>URI</dt><dd><a href="#property2">http://ns.inria.org/edoal/1.0/#property2</a></dd>
<dt>URI</dt><dd><a href="#property1">http://ns.inria.org/edoal/1.0/#property1</a>, <a href="#property2">http://ns.inria.org/edoal/1.0/#property2</a></dd>
<dt>domain</dt><dd><a href="#Equals">Equals</a>, <a href="#Intersects">Intersects</a></dd>
<dt>range</dt><dd><a href="#Attribute">Attribute</a></dd>
<dt>see also</dt><dd><a href="#ssec:linkkeys">Linkkey section</a></dd>
......@@ -1664,7 +1699,7 @@ the EDOAL API requires complete knowledge of the alignment.
</div>
<div class="vocab">
<h3>Class: <a name="Operator">Operator</a></h3>
<h3><b>Deprecated</b> Class: <a name="Operator">Operator</a></h3>
<dl>
<dt>URI</dt><dd><a href="#Operator">http://ns.inria.org/edoal/1.0/#Operator</a></dd>
</dl>
......@@ -1673,9 +1708,7 @@ the EDOAL API requires complete knowledge of the alignment.
<p>
Not yet declared:
<div class="vocab">
Transformation
TransfService implements <i>Clonable</i>
<a href="sec:patterns">Variable</a>
<a href="#sec:patterns">Variable</a>
</pre></div>
</p>
......@@ -1692,7 +1725,7 @@ J&eacute;r&ocirc;me Euzenat and Antoine Zimmermann
in <a href="ftp://ftp.inrialpes.fr/pub/exmo/reports/kweb-2210.pdf">Knowledge
web deliverable 2.2.10</a>, in particular through the semantics of
the language. Its implementation was also reengineered as an extension
of the <a href="format.html">alignment format</a> so that it could be
of the <a href="format.html">Alignment format</a> so that it could be
manipulated through the Alignment API tools (starting version 3.1).
</p>
<p>
......
......@@ -58,9 +58,9 @@ with a warning:
-->
<!--h2>Version 4.9 (2xxx): ??/??/201X - Letraset</h2-->
<!--h2>Version 4.8 (2080): ??/10/2015 - Ant&eacute;sine</h2-->
<!--h2>Version 4.8 (2090): ??/11/2015 - Ant&eacute;sine</h2-->
<p>The Alignment API is now compiled in Java 1.8.</p>
<p>The Alignment API is now compiled in Java 1.8 (please provide feedback if you need it for 1.7).</p>
<p><ul compact="1">
<li>Fixed a bug in pool aggregation (impl)</li>
......@@ -76,6 +76,7 @@ with a warning:
<li>Added alignment <tt>#version</tt> standard extension (format)</li>
<li>Added banner option to server (server)</li>
<li>Added <tt>BasicConfidence</tt> class (impl)</li>
<li>Added <tt>Aggregate</tt> transformation to EDOAL (edoal)</li>
<li>Added normalisation to <tt>BasicAlignment</tt> algebraic operators (impl)</li>
<li>Introduced and fully implemented <tt>DisjunctiveRelation</tt>
and <tt>AlgebraRelation</tt> allowing for using algebras of
......
......@@ -44,6 +44,7 @@ public interface EDOALVisitor {
public void visit( Transformation o ) throws AlignmentException;
public void visit( Value o ) throws AlignmentException;
public void visit( Apply o ) throws AlignmentException;
public void visit( Aggregate o ) throws AlignmentException;
public void visit( Datatype o ) throws AlignmentException;
public void visit( Linkkey o ) throws AlignmentException;
public void visit( LinkkeyEquals o ) throws AlignmentException;
......
......@@ -41,6 +41,7 @@ import org.semanticweb.owl.align.Cell;
import fr.inrialpes.exmo.align.impl.edoal.Expression;
import fr.inrialpes.exmo.align.impl.edoal.Apply;
import fr.inrialpes.exmo.align.impl.edoal.Aggregate;
import fr.inrialpes.exmo.align.impl.edoal.ClassConstruction;
import fr.inrialpes.exmo.align.impl.edoal.ClassDomainRestriction;
import fr.inrialpes.exmo.align.impl.edoal.ClassExpression;
......@@ -815,6 +816,9 @@ public abstract class GraphPatternRendererVisitor extends IndentedRendererVisito
public void visit(final Apply e) throws AlignmentException {
}
public void visit(final Aggregate e) throws AlignmentException {
}
public void visit(final Transformation transf) throws AlignmentException {
}
......
......@@ -70,6 +70,7 @@ import fr.inrialpes.exmo.align.impl.edoal.Transformation;
import fr.inrialpes.exmo.align.impl.edoal.ValueExpression;
import fr.inrialpes.exmo.align.impl.edoal.Value;
import fr.inrialpes.exmo.align.impl.edoal.Apply;
import fr.inrialpes.exmo.align.impl.edoal.Aggregate;
import fr.inrialpes.exmo.align.impl.edoal.Datatype;
import fr.inrialpes.exmo.align.impl.edoal.EDOALCell;
import fr.inrialpes.exmo.align.impl.edoal.EDOALVisitor;
......@@ -700,6 +701,28 @@ public class JSONRendererVisitor extends IndentedRendererVisitor implements Alig
indentedOutput("}");
}
public void visit(final Aggregate e) throws AlignmentException {
indentedOutputln("{ \"@type\" : \"" + SyntaxElement.AGGREGATE.print(DEF) + "\",");
increaseIndent();
indentedOutputln("\"" + SyntaxElement.OPERATOR.print(DEF) + "\" : \"" + e.getOperation() + "\",");
indentedOutputln("\"" + SyntaxElement.ARGUMENTS.print(DEF) + "\" : [");
increaseIndent();
boolean first = true;
for (final ValueExpression ve : e.getArguments()) {
if (first) {
first = false;
} else {
outputln(",");
}
ve.accept(this);
}
outputln();
decreaseIndent();
indentedOutputln("]");
decreaseIndent();
indentedOutput("}");
}
public void visit(final Transformation transf) throws AlignmentException {
indentedOutputln("{ \"@type\" : \"" + SyntaxElement.TRANSF.print(DEF) + "\",");
increaseIndent();
......
......@@ -72,6 +72,7 @@ import fr.inrialpes.exmo.align.impl.edoal.Transformation;
import fr.inrialpes.exmo.align.impl.edoal.ValueExpression;
import fr.inrialpes.exmo.align.impl.edoal.Value;
import fr.inrialpes.exmo.align.impl.edoal.Apply;
import fr.inrialpes.exmo.align.impl.edoal.Aggregate;
import fr.inrialpes.exmo.align.impl.edoal.Datatype;
import fr.inrialpes.exmo.align.impl.edoal.Comparator;
import fr.inrialpes.exmo.align.impl.edoal.EDOALCell;
......@@ -825,6 +826,10 @@ public class OWLAxiomsRendererVisitor extends IndentedRendererVisitor implements
throw new AlignmentException( "Cannot render function call in OWL "+e );
}
public void visit( final Aggregate e ) throws AlignmentException {
throw new AlignmentException( "Cannot render value aggregation in OWL "+e );
}
// Not implemented. We only ignore transformations in OWL
public void visit( final Transformation transf ) throws AlignmentException {
logger.debug( "Transformations ignored in OWL" );
......
......@@ -73,6 +73,7 @@ import fr.inrialpes.exmo.align.impl.edoal.Transformation;
import fr.inrialpes.exmo.align.impl.edoal.ValueExpression;
import fr.inrialpes.exmo.align.impl.edoal.Value;
import fr.inrialpes.exmo.align.impl.edoal.Apply;
import fr.inrialpes.exmo.align.impl.edoal.Aggregate;
import fr.inrialpes.exmo.align.impl.edoal.Datatype;
import fr.inrialpes.exmo.align.impl.edoal.EDOALCell;
import fr.inrialpes.exmo.align.impl.edoal.EDOALVisitor;
......@@ -720,6 +721,22 @@ public class RDFRendererVisitor extends IndentedRendererVisitor implements Align
indentedOutput("</" + SyntaxElement.APPLY.print(DEF) + ">");
}
public void visit(final Aggregate e) throws AlignmentException {
indentedOutputln("<" + SyntaxElement.AGGREGATE.print(DEF) + " " + SyntaxElement.OPERATOR.print(DEF) + "=\"" + e.getOperation() + "\">");
increaseIndent();
indentedOutputln("<" + SyntaxElement.ARGUMENTS.print(DEF) + " " + SyntaxElement.RDF_PARSETYPE.print(DEF) + "=\"Collection\">");
increaseIndent();
for (final ValueExpression ve : e.getArguments()) {
output(linePrefix);
ve.accept(this);
outputln();
}
decreaseIndent();
indentedOutputln("</" + SyntaxElement.ARGUMENTS.print(DEF) + ">");
decreaseIndent();
indentedOutput("</" + SyntaxElement.AGGREGATE.print(DEF) + ">");
}
public void visit(final Transformation transf) throws AlignmentException {
indentedOutputln("<" + SyntaxElement.TRANSF.print(DEF) + " " + SyntaxElement.TRDIR.print(DEF) + "=\"" + transf.getType() + "\">");
increaseIndent();
......
......@@ -67,6 +67,7 @@ import fr.inrialpes.exmo.align.impl.edoal.Transformation;
import fr.inrialpes.exmo.align.impl.edoal.ValueExpression;
import fr.inrialpes.exmo.align.impl.edoal.Value;
import fr.inrialpes.exmo.align.impl.edoal.Apply;
import fr.inrialpes.exmo.align.impl.edoal.Aggregate;
import fr.inrialpes.exmo.align.impl.edoal.Datatype;
import fr.inrialpes.exmo.align.impl.edoal.Comparator;
import fr.inrialpes.exmo.align.impl.edoal.Variable;
......@@ -1030,6 +1031,30 @@ public class RDFParser {
}
}
return new Apply(op, valexpr);
} else if (nodeType.equals(SyntaxElement.AGGREGATE.resource)) {
// Get the operation
URI op;
if (((Resource) node).hasProperty((Property) SyntaxElement.OPERATOR.resource)) {
String operation = ((Resource) node).getProperty((Property) SyntaxElement.OPERATOR.resource).getLiteral().getString();
try {
op = new URI(operation);
} catch (URISyntaxException e) {
throw new AlignmentException("edoal:Aggregate incorrect operation URI : " + operation);
}
} else {
throw new AlignmentException("edoal:Aggregate requires an operation");
}
// Get all arguments
List<ValueExpression> valexpr = new LinkedList<ValueExpression>();
if (((Resource) node).hasProperty((Property) SyntaxElement.ARGUMENTS.resource)) {
Statement stmt = ((Resource) node).getProperty((Property) SyntaxElement.ARGUMENTS.resource);
Resource coll = stmt.getResource(); // MUSTCHECK
while (!RDF.nil.getURI().equals(coll.getURI())) {
valexpr.add(parseValue(coll.getProperty(RDF.first).getResource()));
coll = coll.getProperty(RDF.rest).getResource();
}
}
return new Aggregate(op, valexpr);
} else { // Check that pe is a Path??
return parsePathExpression((Resource) node);
}
......
......@@ -85,6 +85,7 @@ public enum SyntaxElement {
// EDOAL NAMESPACE
AND(Namespace.EDOAL, "and", Constructor.AND),
APPLY(Namespace.EDOAL, "Apply", true),
AGGREGATE(Namespace.EDOAL, "Aggregate", true),
ARGUMENTS(Namespace.EDOAL, "arguments"),
ATTR_TRANSF(Namespace.EDOAL, "transf"),
CLASS_EXPR(Namespace.EDOAL, "Class", true),//ALIGNMENT
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment