diff --git a/lib/align.jar b/lib/align.jar
index 8c4c4da4aeca5e67dc3b8865e34277d049e912f9..c827775110eb1fc89676be7837cc95aa26438ad3 100644
Binary files a/lib/align.jar and b/lib/align.jar differ
diff --git a/lib/align.pom b/lib/align.pom
index cf2808c1caac3c0cb72257db675361441654adc7..e464f8f9d2d6f45fbbe89173017ecf4e2e315c2d 100644
--- a/lib/align.pom
+++ b/lib/align.pom
@@ -17,7 +17,7 @@
   <groupId>org.semanticweb.owl</groupId>
   <artifactId>align</artifactId>
   <version>4.6</version>
-  <!-- Rev 1954:1957M 03/09/2014 -->
+  <!-- Rev 1969M 11/09/2014 -->
   <name>The Alignment API</name>
   <description>The Alignment API is an API for manipulating ontology alignments.</description>
   <url>http://alignapi.gforge.inria.fr</url>
diff --git a/lib/alignsvc.jar b/lib/alignsvc.jar
index 743fabd92428e8d8baa2b8f339cf9389d3190c3a..d13fcb3b2bb49fb58841a9cfdc059e44a4ae4ff8 100644
Binary files a/lib/alignsvc.jar and b/lib/alignsvc.jar differ
diff --git a/lib/alignsvc.pom b/lib/alignsvc.pom
index 1e17bea3159ed15d034de164d0df0a5153921929..add728752ca76847b8a8bf6bc73c248b04987ebe 100644
--- a/lib/alignsvc.pom
+++ b/lib/alignsvc.pom
@@ -17,7 +17,7 @@
   <groupId>fr.inrialpes.exmo.align</groupId>
   <artifactId>alignsvc</artifactId>
   <version>4.6</version>
-  <!-- Rev 1954:1957M 03/09/2014 -->
+  <!-- Rev 1969M 11/09/2014 -->
   <name>Alignment server</name>
   <description>A server for storing and sharing ontology alignments.</description>
   <url>http://alignapi.gforge.inria.fr</url>
diff --git a/lib/ontowrap.jar b/lib/ontowrap.jar
index fd98b4964f1058f37e31a782eb68711b8085aa57..af9d3895820977390dc10c833f613e66d5a03ac2 100644
Binary files a/lib/ontowrap.jar and b/lib/ontowrap.jar differ
diff --git a/lib/ontowrap.pom b/lib/ontowrap.pom
index d47550890fcaedddfcbb1f30bd11829f5dc4c9ea..be8652c95ba3d7eab4d04c3c9cce65d0e499b7ee 100644
--- a/lib/ontowrap.pom
+++ b/lib/ontowrap.pom
@@ -17,7 +17,7 @@
   <groupId>fr.inrialpes.exmo</groupId>
   <artifactId>ontowrap</artifactId>
   <version>4.6</version>
-  <!-- Rev 1954:1957M 03/09/2014 -->
+  <!-- Rev 1969M 11/09/2014 -->
   <name>Ontology wrapping API</name>
   <description>An ontology wrapping API and library.</description>
   <url>http://alignapi.gforge.inria.fr</url>
diff --git a/lib/procalign.jar b/lib/procalign.jar
index 64c834bed3a57a0f74fd65e503f09612217ad8d3..a364949e1a69d475ddfad54e0ff0f986ad7b8c3d 100644
Binary files a/lib/procalign.jar and b/lib/procalign.jar differ
diff --git a/lib/procalign.pom b/lib/procalign.pom
index f2221d602339c8b35bf606b681677a84b53cb924..35babd57e3266ac612973a2b3aeebd63c8343159 100644
--- a/lib/procalign.pom
+++ b/lib/procalign.pom
@@ -17,7 +17,7 @@
   <groupId>fr.inrialpes.exmo.align</groupId>
   <artifactId>procalign</artifactId>
   <version>4.6</version>
-  <!-- Rev 1954:1957M 03/09/2014 -->
+  <!-- Rev 1969M 11/09/2014 -->
   <name>Reference implementation of the Alignment API</name>
   <description>Implementation of the Alignment API for manipulating ontology alignments.</description>
   <url>http://alignapi.gforge.inria.fr</url>
diff --git a/src/fr/inrialpes/exmo/align/impl/renderer/GraphPatternRendererVisitor.java b/src/fr/inrialpes/exmo/align/impl/renderer/GraphPatternRendererVisitor.java
index c4babb2603e7f3a3831f10ec6151e2e3f5392f7c..6994d1f486312bf6bd8666896293f9c14d73af58 100644
--- a/src/fr/inrialpes/exmo/align/impl/renderer/GraphPatternRendererVisitor.java
+++ b/src/fr/inrialpes/exmo/align/impl/renderer/GraphPatternRendererVisitor.java
@@ -77,8 +77,6 @@ import java.util.LinkedList;
 public abstract class GraphPatternRendererVisitor extends IndentedRendererVisitor implements EDOALVisitor {
 
     final static Logger logger = LoggerFactory.getLogger(GraphPatternRendererVisitor.class);
-    protected static String FEDERATED_SERVICE_INTRODUCTION = "FEDERATED_SERVICE_BEGIN";
-    protected static String FEDERATED_SERVICE_FINALIZATION = "FEDERATED_SERVICE_END";
 
     Alignment alignment = null;
     Cell cell = null;
@@ -107,7 +105,7 @@ public abstract class GraphPatternRendererVisitor extends IndentedRendererVisito
     private String strBGP = "";
     protected List<String> listBGP = null;
     private Set<String> subjectsRestriction = null;
-    
+
     private Set<String> objectsRestriction = null;
     protected Hashtable<String, String> prefixList = null;
 
@@ -178,6 +176,9 @@ public abstract class GraphPatternRendererVisitor extends IndentedRendererVisito
         return obj;
     }
 
+    protected void addToGP(String str){
+        strBGP += str;
+    }
     protected String getGP() {
         return strBGP;
     }
@@ -225,35 +226,23 @@ public abstract class GraphPatternRendererVisitor extends IndentedRendererVisito
         }
         return ns;
     }
-    
-    
-    protected final void split(boolean split, String splitdir){
-        if(split){
+
+    protected final void split(boolean split, String splitdir) {
+        if (split) {
             this.split = split;
             this.splitdir = splitdir;
-        }
-        else{
+        } else {
             this.split = false;
             this.splitdir = null;
         }
     }
-    
-    
-    private static String cleanQuery(String query, String serviceName){
-        if(serviceName == null || serviceName == "" ){
-            return query.replaceAll(FEDERATED_SERVICE_INTRODUCTION, "").replaceAll(FEDERATED_SERVICE_FINALIZATION, "");
-        }else{
-            return query.replaceAll(FEDERATED_SERVICE_INTRODUCTION, String.format("\nSERVICE <%s> {", serviceName)).replaceAll(FEDERATED_SERVICE_FINALIZATION, "}\n");
-        }
-    }
-    
+
     public void saveQuery(Object referer, String query) {
         //Query is stored in memory
-        if(!queries.containsKey(referer)){
+        if (!queries.containsKey(referer)) {
             queries.put(referer, new LinkedList<String>());
         }
         queries.get(referer).add(query);
-        query = cleanQuery(query, null);
         if (split) {
             BufferedWriter out = null;
             try {
@@ -268,25 +257,31 @@ public abstract class GraphPatternRendererVisitor extends IndentedRendererVisito
             } catch (IOException ioe) {
                 logger.debug("IGNORED Exception", ioe);
             }
-        }else{
+        } else {
             writer.println(query);
         }
     }
-    
+
     /**
      * Produce Query only for local call.
+     *
      * @param referer
      * @param index
-     * @return 
+     * @return
      */
-    public String getQuery(Object referer, int index){
-        return getQuery(referer, index, null);
+    protected String getQuery(Object referer, int index) {
+        return queries.get(referer).get(index);
+    }
+
+    public String getQueryFromOnto1ToOnto2(Object referer){
+        return getQuery(referer, 1);
     }
     
-    public String getQuery(Object referer, int index, URI remoteURI){
-        return cleanQuery(queries.get(referer).get(index), (remoteURI == null ? null : remoteURI.toString()));
+    
+    public String getQueryFromOnto2ToOnto1(Object referer){
+        return getQuery(referer, 0);
     }
-
+    
     protected String createPrefixList() {
         String result = "";
         for (String k : prefixList.keySet()) {
@@ -514,7 +509,7 @@ public abstract class GraphPatternRendererVisitor extends IndentedRendererVisito
             strBGP += "})" + NL;
         } else if (op == Constructor.COMP) {
             String tempSub = sub;
-	    //if ( blanks && this.getClass() == SPARQLConstructRendererVisitor.class ) {
+            //if ( blanks && this.getClass() == SPARQLConstructRendererVisitor.class ) {
             //	obj = "_:o" + ++count;
             //}
             String tempObj = obj;
@@ -666,7 +661,7 @@ public abstract class GraphPatternRendererVisitor extends IndentedRendererVisito
         } else if (op == Constructor.COMP) {
             int size = e.getComponents().size();
             String temp = sub;
-	    //if ( blanks && this.getClass() == SPARQLConstructRendererVisitor.class ) {
+            //if ( blanks && this.getClass() == SPARQLConstructRendererVisitor.class ) {
             //obj = "_:o" + ++count;
             createVarName();
             //}
diff --git a/src/fr/inrialpes/exmo/align/impl/renderer/SPARQLConstructRendererVisitor.java b/src/fr/inrialpes/exmo/align/impl/renderer/SPARQLConstructRendererVisitor.java
index bf84109f5a66206eae0e5257a999860d08583cf9..a015497422f36dde93e4ca88584a7b073cb0bc71 100644
--- a/src/fr/inrialpes/exmo/align/impl/renderer/SPARQLConstructRendererVisitor.java
+++ b/src/fr/inrialpes/exmo/align/impl/renderer/SPARQLConstructRendererVisitor.java
@@ -195,11 +195,12 @@ public class SPARQLConstructRendererVisitor extends GraphPatternRendererVisitor
     }
 
     protected String createConstruct(String GP1, String GP2) {
-        return createPrefixList() + "CONSTRUCT {" + NL + GP1 + "}" + NL + "WHERE {" + FEDERATED_SERVICE_INTRODUCTION + NL + GP2 + FEDERATED_SERVICE_FINALIZATION + "}" + NL;
+        return createPrefixList() + "CONSTRUCT {" + NL + GP1 + "}" + NL + "WHERE {" + NL + GP2  + "}" + NL;
     }
 
     protected String createCoreseQuery(String query) {
         return "<rule>" + NL + "<body>" + NL + "<![CDATA[" + NL + query + "]]>" + NL + "</body>" + NL + "</rule>" + NL + NL;
     }
-
+    
+    
 }
diff --git a/src/fr/inrialpes/exmo/align/impl/renderer/SPARQLSelectRendererVisitor.java b/src/fr/inrialpes/exmo/align/impl/renderer/SPARQLSelectRendererVisitor.java
index 18c84673a0ea5c911d23e2feea0c0178bb90d986..6c77da9485420105a25fc1c7376446e6fb2083d1 100644
--- a/src/fr/inrialpes/exmo/align/impl/renderer/SPARQLSelectRendererVisitor.java
+++ b/src/fr/inrialpes/exmo/align/impl/renderer/SPARQLSelectRendererVisitor.java
@@ -27,16 +27,22 @@ import org.semanticweb.owl.align.Relation;
 
 import fr.inrialpes.exmo.align.impl.BasicAlignment;
 import fr.inrialpes.exmo.align.impl.edoal.EDOALAlignment;
+import fr.inrialpes.exmo.align.impl.edoal.EDOALCell;
 import fr.inrialpes.exmo.align.impl.edoal.Expression;
 import fr.inrialpes.exmo.align.impl.edoal.Linkkey;
 import fr.inrialpes.exmo.align.impl.edoal.LinkkeyBinding;
 import fr.inrialpes.exmo.align.impl.edoal.LinkkeyEquals;
 import fr.inrialpes.exmo.align.impl.edoal.LinkkeyIntersects;
+import static fr.inrialpes.exmo.align.impl.renderer.GraphPatternRendererVisitor.blanks;
 
 import java.io.PrintWriter;
 import java.net.URI;
+import java.util.ArrayList;
 import java.util.Hashtable;
+import java.util.LinkedList;
+import java.util.List;
 import java.util.Properties;
+import java.util.Set;
 
 public class SPARQLSelectRendererVisitor extends GraphPatternRendererVisitor implements AlignmentVisitor {
 
@@ -51,6 +57,8 @@ public class SPARQLSelectRendererVisitor extends GraphPatternRendererVisitor imp
 
     boolean edoal = false;
 
+    boolean fromOnto1ToOnto2 = true;
+
     public SPARQLSelectRendererVisitor(PrintWriter writer) {
         super(writer);
     }
@@ -106,47 +114,174 @@ public class SPARQLSelectRendererVisitor extends GraphPatternRendererVisitor imp
         if (subsumedInvocableMethod(this, cell, Cell.class)) {
             return;
         }
+        // default behaviour
         this.cell = cell;
-
         URI u1 = cell.getObject1AsURI(alignment);
-        if (edoal || u1 != null) {
-            generateSelect((Expression) (cell.getObject1()));
-        }
-        if (!oneway) {
-            URI u2 = cell.getObject2AsURI(alignment);
-            if (edoal || u2 != null) {
-                generateSelect((Expression) (cell.getObject2()));
+        URI u2 = cell.getObject2AsURI(alignment);
+        if (edoal || (u1 != null && u2 != null)) {
+            generateSelect(cell, (Expression) (cell.getObject1()), (Expression) (cell.getObject2()), false);
+            if (!oneway) {
+                generateSelect(cell, (Expression) (cell.getObject1()), (Expression) (cell.getObject2()), true);
             }
         }
     }
 
-    protected void generateSelect(Expression expr) throws AlignmentException {
-        resetVariables(expr, "s", "o");
-        expr.accept(this);
-        String query = createPrefixList() + "SELECT * WHERE {" + NL + getGP() + "}" + NL;
-        saveQuery(expr, query);
-    }
-
     public void visit(Relation rel) throws AlignmentException {
         if (subsumedInvocableMethod(this, rel, Relation.class)) {
             return;
         }
-	// default behaviour
-        // rel.write( writer );
     }
-    
+
     public void visit(final Linkkey linkkey) throws AlignmentException {
-        throw new AlignmentException("NOT IMPLEMENTED !");
+        for (LinkkeyBinding linkkeyBinding : linkkey.bindings()) {
+            linkkeyBinding.accept(this);
+        }
+    }
+
+    protected void resetS1(String obj) {
+        if(fromOnto1ToOnto2){
+            resetVariables("?s1", obj); 
+        }else{
+            resetVariables("?s2", obj);
+        }
+    }
+
+    protected void resetS2(String obj) {
+        if(fromOnto1ToOnto2){
+            resetVariables("?s2", obj); 
+        }else{
+            resetVariables("?s1", obj);
+        }
     }
     
+    /**
+     * Where each element must be equal
+     *
+     * @param linkkeyEquals
+     * @throws AlignmentException
+     */
     public void visit(final LinkkeyEquals linkkeyEquals) throws AlignmentException {
-        throw new AlignmentException("NOT IMPLEMENTED !");
+        //Main part for selection
+//        resetVariables("?s1", "?o1");
+        resetS1("?o1");
+        Expression expr1 = linkkeyEquals.getExpression1();
+        expr1.accept(this);
+//        resetVariables("?s2", "?o2");
+        resetS2("?o2");
+        Expression expr2 = linkkeyEquals.getExpression2();
+        expr2.accept(this);
+        //Retrieving intersect elements
+        addToGP("MINUS { " + NL
+                + "SELECT DISTINCT ?s1 ?s2 " + NL
+                + "WHERE " + NL
+                + "{ " + NL);
+//        resetVariables("?s1", "?o1");
+        resetS1("?o1");
+        expr1.accept(this);
+//        resetVariables("?s1", "?o2");
+        resetS1("?o2");
+        expr1.accept(this);
+//        resetVariables("?s2", "?o3");
+        resetS2("?o3");
+        expr2.accept(this);
+        addToGP("FILTER(?s1 != ?s2 && ?o2 != ?o1 && ?o3 = ?o1 && NOT EXISTS {" + NL);
+//        resetVariables("?s2", "?o2");
+        resetS2("?o2");
+        expr2.accept(this);
+        addToGP("}) " + NL);
+        addToGP("} " + NL);
+        addToGP("} " + NL);
+        //Second part
+        addToGP("MINUS {" + NL
+                + "SELECT DISTINCT ?s1 ?s2 " + NL
+                + "WHERE " + NL
+                + "{ " + NL);
+//        resetVariables("?s1", "?o1");
+        resetS1("?o1");
+        expr1.accept(this);
+//        resetVariables("?s2", "?o2");
+        resetS2("?o2");
+        expr2.accept(this);
+//        resetVariables("?s2", "?o3");
+        resetS2("?o3");
+        expr2.accept(this);
+        addToGP("FILTER(?s1 != ?s2 && ?o2 != ?o3 && ?o2 = ?o1 && NOT EXISTS {" + NL);
+//        resetVariables("?s1", "?o3");
+        resetS1("?o3");
+        expr1.accept(this);
+        addToGP("})" + NL);
+        addToGP("}" + NL);
+        addToGP("}" + NL);
     }
+
+    /**
+     * Where we must have at least one element equal between each source.
+     *
+     * @param linkkeyIntersects
+     * @throws AlignmentException
+     */
     public void visit(final LinkkeyIntersects linkkeyIntersects) throws AlignmentException {
-        throw new AlignmentException("NOT IMPLEMENTED !");
+//        resetVariables("?s1", "?o1");
+        resetS1("?o1");
+        Expression expr1 = linkkeyIntersects.getExpression1();
+        expr1.accept(this);
+//        resetVariables("?s2", "?o2");
+        resetS2("?o2");
+        Expression expr2 = linkkeyIntersects.getExpression2();
+        expr2.accept(this);
     }
-    
-//    public void visit(final LinkkeyBinding linkkeyBinding) throws AlignmentException {
-//        throw new AlignmentException("NOT IMPLEMENTED !");
-//    }
+
+    protected void generateSelect(Cell cell, Expression expr1, Expression expr2, boolean from1To2) throws AlignmentException {
+        // Here the generation is dependent on global variables
+        List<String> listGP = new LinkedList();
+        blanks = false;
+        fromOnto1ToOnto2 = from1To2;
+        // :-( should find something better !!
+        if (fromOnto1ToOnto2) {
+            resetVariables(expr1, "s1", "o");
+        } else {
+            resetVariables(expr1, "s2", "o");
+        }
+        expr1.accept(this);
+        listGP.add(getGP());
+        if (fromOnto1ToOnto2) {
+            resetVariables(expr2, "s2", "o");
+        } else {
+            resetVariables(expr1, "s1", "o");
+        }
+        expr2.accept(this);
+        listGP.add(getGP());
+        initStructure();
+        boolean hasLinkeys = false;
+        String filter = "FILTER(?s1 != ?s2)";
+        Set<Linkkey> linkkeys = ((EDOALCell) cell).linkkeys();
+        if (linkkeys != null) {
+            hasLinkeys = true;
+            for (Linkkey linkkey : linkkeys) {
+                linkkey.accept(this);
+            }
+        }
+        if (hasLinkeys) {
+            filter = "FILTER(?s1 != ?s2 && ?o2 = ?o1)";
+            listGP.add(getGP());
+        }
+        // End of global variables
+        String query = createSelect(listGP, filter);
+        if (corese) {
+            throw new AlignmentException("corese case NOT IMPLEMENTED for SPARQLSelectRendererVisitor !!");
+        }
+        if (corese) {
+            return;
+        }
+        saveQuery(cell, query);
+    }
+
+    protected String createSelect(List<String> listGP, String filter) {
+        StringBuilder mainGPBuilder = new StringBuilder();
+        for (String GP : listGP) {
+            mainGPBuilder.append(GP);
+        }
+        return createPrefixList() + "SELECT DISTINCT ?s1 ?s2 " + NL + "WHERE {" + NL + mainGPBuilder + filter + NL + "}" + NL;
+    }
+
 }
diff --git a/test/input/alignment3.rdf b/test/input/alignment3.rdf
new file mode 100644
index 0000000000000000000000000000000000000000..85d7355f8e158d6a930e2f0df65023bde06259af
--- /dev/null
+++ b/test/input/alignment3.rdf
@@ -0,0 +1,49 @@
+<?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:ns0='http://exmo.inrialpes.fr/align/service#'
+         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/#'>
+    <Alignment rdf:about="http://localhost:8089/alid/1394718240757/976">
+        <xml>yes</xml>
+        <level>2EDOAL</level>
+        <type>?*</type>
+        <pretty>test1</pretty>
+        <ns0:cached>Thu Mar 13 14:44:05 CET 2014</ns0:cached>
+        <ns0:stored>null</ns0:stored>
+        <time>34</time>
+        <ns0:ouri2>http://purl.org/ontology/mo/</ns0:ouri2>
+        <id>http://localhost:8089/alid/1394718240757/976</id>
+        <ns0:ouri1>http://exmo.inrialpes.fr/connectors/example_musical_work_desc/</ns0:ouri1>
+        <method>fr.inrialpes.exmo.align.impl.method.SubsDistNameAlignment</method>
+        <onto1>
+            <Ontology rdf:about="http://exmo.inrialpes.fr/connectors/example_musical_work_desc/">
+                <location>/home/tests/example_musical_work_desc.owl</location>
+                <formalism>
+                    <Formalism align:name="OWL2.0" align:uri="http://www.w3.org/2002/07/owl#"/>
+                </formalism>
+            </Ontology>
+        </onto1>
+        <onto2>
+            <Ontology rdf:about="http://purl.org/ontology/mo/">
+                <location>http://purl.org/ontology/mo/</location>
+                <formalism>
+                    <Formalism align:name="OWL2.0" align:uri="http://www.w3.org/2002/07/owl#"/>
+                </formalism>
+            </Ontology>
+        </onto2>
+        <map>
+            <Cell rdf:about="http://exmo.inrialpes.fr/connectors#cell1">
+                <entity1>
+                  <edoal:Class rdf:about="http://exmo.inrialpes.fr/connectors#RootElement"/>
+                </entity1>
+                <entity2>
+                  <edoal:Class rdf:about="http://purl.org/ontology/mo/MusicalWork"/>
+                </entity2>
+                <relation>=</relation>
+                <measure rdf:datatype='http://www.w3.org/2001/XMLSchema#float'>1.0</measure>
+            </Cell>
+        </map>
+    </Alignment>
+</rdf:RDF>
diff --git a/test/input/equals_people_1.rdf b/test/input/equals_people_1.rdf
new file mode 100644
index 0000000000000000000000000000000000000000..8bd641696f3e2348faec81a5094c6723b6b669f8
--- /dev/null
+++ b/test/input/equals_people_1.rdf
@@ -0,0 +1,224 @@
+<?xml version="1.0"?>
+<!DOCTYPE rdf:RDF [
+    <!ENTITY owl "http://www.w3.org/2002/07/owl#" >
+    <!ENTITY xsd "http://www.w3.org/2001/XMLSchema#" >
+    <!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#" >
+    <!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#" >
+    <!ENTITY foaf "http://xmlns.com/foaf/0.1/" >
+    <!ENTITY exmo "http://exmo.inrialpes.fr/connectors-core/" >
+]>
+<rdf:RDF xmlns="http://exmo.inrialpes.fr/connectors-data/people/"
+     xml:base="http://exmo.inrialpes.fr/connectors-data/people/"
+     xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
+     xmlns:foaf="http://xmlns.com/foaf/0.1/"
+     xmlns:exmo="http://exmo.inrialpes.fr/connectors-core/"
+     xmlns:owl="http://www.w3.org/2002/07/owl#"
+     xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
+     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+    <owl:Ontology rdf:about="http://exmo.inrialpes.fr/connectors-data/people/">
+      <owl:imports rdf:resource="http://xmlns.com/foaf/0.1/"/>
+    </owl:Ontology>
+<!--
+Tests are on two main elements tested on datas for one property : 
+ - quantity : = | < | > =>  where card on people_1 is = | > | < to card
+   on people_2 (card is the number of resources for one specified
+   property
+ -Nb differences that can be : 
+  - 0
+  - 1
+  - Q = min(card(people_1), card(people)) - 1 => for the specified property
+  - n with 0 < n < Q
+)
+###qty##NbDiff###Linkey#####Case
+### = ##  0   ##Equals######AliceC1
+### = ##  1   ##Intersects##AliceC2
+### = ##  n   ##Intersects##AliceC3
+### = ##  Q   ##############AliceC4
+### > ##  0   ##Intersects##DaveC1
+### > ##  1   ##Intersects##DaveC2
+### > ##  n   ##Intersects##DaveC3
+### > ##  Q   ##############DaveC4
+### < ##  0   ##Intersects##CarolC1
+### < ##  1   ##Intersects##CarolC2
+### < ##  n   ##Intersects##CarolC3
+### < ##  Q   ##############CarolC4
+
+Nothing : 
+-->
+
+
+    <rdf:Description rdf:about="http://exmo.inrialpes.fr/connectors-data/people#alice_c0"><!-- CANNOT NO INTERSECTS (not same type) -->
+        <rdf:type rdf:resource="&exmo;OtherPersonneType"/>
+        <exmo:nom>AliceC1</exmo:nom>
+        <exmo:nom>AliceC1_1</exmo:nom>
+        <exmo:nom>AliceC1_2_other</exmo:nom>
+        <exmo:boitemel>alice1@gmail.com</exmo:boitemel>
+        <exmo:boitemel>alice1@msn.com</exmo:boitemel>
+    </rdf:Description>
+
+
+    <rdf:Description rdf:about="http://exmo.inrialpes.fr/connectors-data/people#alice_c1_1"><!-- EQUALS -->
+        <rdf:type rdf:resource="&exmo;Personne"/>
+        <exmo:nom>AliceC1</exmo:nom>
+        <exmo:nom>AliceC1_1</exmo:nom>
+        <exmo:nom>AliceC1_2</exmo:nom>
+        <exmo:boitemel>alice1@gmail.com</exmo:boitemel>
+        <exmo:boitemel>alice1@msn.com</exmo:boitemel>
+    </rdf:Description>
+
+
+
+    <rdf:Description rdf:about="http://exmo.inrialpes.fr/connectors-data/people#alice_c2_1"><!-- INTERSECTS -->
+        <rdf:type rdf:resource="&exmo;Personne"/>
+        <exmo:nom>AliceC2</exmo:nom>
+        <exmo:nom>AliceC2_1</exmo:nom>
+        <exmo:nom>AliceC2_2</exmo:nom>
+        <exmo:boitemel>alice1@gmail.com</exmo:boitemel>
+        <exmo:boitemel>alice1@msn.com</exmo:boitemel>
+    </rdf:Description>
+
+    <rdf:Description rdf:about="http://exmo.inrialpes.fr/connectors-data/people#alice_c3_1"><!-- INTERSECTS -->
+        <rdf:type rdf:resource="&exmo;Personne"/>
+        <exmo:nom>AliceC3</exmo:nom>
+        <exmo:nom>AliceC3_1</exmo:nom>
+        <exmo:nom>AliceC3_2</exmo:nom>
+        <exmo:nom>AliceC3_3</exmo:nom>
+        <exmo:nom>AliceC3_4</exmo:nom>
+        <exmo:nom>AliceC3_5</exmo:nom>
+        <exmo:nom>AliceC3_6</exmo:nom>
+        <exmo:boitemel>alice1@gmail.com</exmo:boitemel>
+        <exmo:boitemel>alice1@msn.com</exmo:boitemel>
+    </rdf:Description>
+
+    <rdf:Description rdf:about="http://exmo.inrialpes.fr/connectors-data/people#alice_c4_1"><!-- INTERSECTS -->
+        <rdf:type rdf:resource="&exmo;Personne"/>
+        <exmo:nom>AliceC4</exmo:nom>
+        <exmo:nom>AliceC4_1</exmo:nom>
+        <exmo:nom>AliceC4_2</exmo:nom>
+        <exmo:nom>AliceC4_3</exmo:nom>
+        <exmo:nom>AliceC4_4</exmo:nom>
+        <exmo:nom>AliceC4_5</exmo:nom>
+        <exmo:nom>AliceC4_6</exmo:nom>
+        <exmo:boitemel>alice1@gmail.com</exmo:boitemel>
+        <exmo:boitemel>alice1@msn.com</exmo:boitemel>
+    </rdf:Description>
+
+    <rdf:Description
+        rdf:about="http://exmo.inrialpes.fr/connectors-data/people#dave_c1_1">
+        <rdf:type rdf:resource="&exmo;Personne"/>
+        <exmo:nom>DaveC1</exmo:nom>
+        <exmo:nom>DaveC1_1</exmo:nom>
+        <exmo:nom>DaveC1_2</exmo:nom>
+        <exmo:nom>DaveC1_3</exmo:nom>
+        <exmo:nom>DaveC1_4</exmo:nom>
+        <exmo:nom>DaveC1_5</exmo:nom>
+        <exmo:nom>DaveC1_6</exmo:nom>
+        <exmo:boitemel>dave@gmail.com</exmo:boitemel>
+        <exmo:boitemel>dave1@msn.com</exmo:boitemel>
+    </rdf:Description>
+
+    <rdf:Description
+        rdf:about="http://exmo.inrialpes.fr/connectors-data/people#dave_c2_1">
+        <rdf:type rdf:resource="&exmo;Personne"/>
+        <exmo:nom>DaveC2</exmo:nom>
+        <exmo:nom>DaveC2_1</exmo:nom>
+        <exmo:nom>DaveC2_2</exmo:nom>
+        <exmo:nom>DaveC2_3</exmo:nom>
+        <exmo:nom>DaveC2_4</exmo:nom>
+        <exmo:nom>DaveC2_5</exmo:nom>
+        <exmo:nom>DaveC2_6</exmo:nom>
+        <exmo:boitemel>dave@gmail.com</exmo:boitemel>
+        <exmo:boitemel>dave1@msn.com</exmo:boitemel>
+    </rdf:Description>
+
+    <rdf:Description
+        rdf:about="http://exmo.inrialpes.fr/connectors-data/people#dave_c3_1">
+        <rdf:type rdf:resource="&exmo;Personne"/>
+        <exmo:nom>DaveC3</exmo:nom>
+        <exmo:nom>DaveC3_1</exmo:nom>
+        <exmo:nom>DaveC3_2</exmo:nom>
+        <exmo:nom>DaveC3_3_diff</exmo:nom>
+        <exmo:nom>DaveC3_4</exmo:nom>
+        <exmo:nom>DaveC3_5</exmo:nom>
+        <exmo:nom>DaveC3_6</exmo:nom>
+        <exmo:boitemel>dave@gmail.com</exmo:boitemel>
+        <exmo:boitemel>dave1@msn.com</exmo:boitemel>
+    </rdf:Description>
+
+    <rdf:Description
+        rdf:about="http://exmo.inrialpes.fr/connectors-data/people#dave_c4_1">
+        <rdf:type rdf:resource="&exmo;Personne"/>
+        <exmo:nom>DaveC4</exmo:nom>
+        <exmo:nom>DaveC4_1</exmo:nom>
+        <exmo:nom>DaveC4_2</exmo:nom>
+        <exmo:nom>DaveC4_3</exmo:nom>
+        <exmo:nom>DaveC4_4</exmo:nom>
+        <exmo:nom>DaveC4_5</exmo:nom>
+        <exmo:nom>DaveC4_6</exmo:nom>
+        <exmo:boitemel>dave@gmail.com</exmo:boitemel>
+        <exmo:boitemel>dave1@msn.com</exmo:boitemel>
+    </rdf:Description>
+
+
+    <rdf:Description
+        rdf:about="http://exmo.inrialpes.fr/connectors-data/people#carol_c1_1">
+        <rdf:type rdf:resource="&exmo;Personne"/>
+        <exmo:nom>CarolC1</exmo:nom>
+        <exmo:nom>CarolC1_1</exmo:nom>
+        <exmo:nom>CarolC1_2</exmo:nom>
+        <exmo:nom>CarolC1_3</exmo:nom>
+        <exmo:nom>CarolC1_4</exmo:nom>
+        <exmo:nom>CarolC1_5</exmo:nom>
+        <exmo:boitemel>carol1@gmail.com</exmo:boitemel>
+        <exmo:boitemel>carol1@msn.com</exmo:boitemel>
+    </rdf:Description>
+
+    <rdf:Description
+        rdf:about="http://exmo.inrialpes.fr/connectors-data/people#carol_c2_1">
+        <rdf:type rdf:resource="&exmo;Personne"/>
+        <exmo:nom>CarolC2</exmo:nom>
+        <exmo:nom>CarolC2_1</exmo:nom>
+        <exmo:nom>CarolC2_2</exmo:nom>
+        <exmo:nom>CarolC2_3</exmo:nom>
+        <exmo:nom>CarolC2_4</exmo:nom>
+        <exmo:nom>CarolC2_5</exmo:nom>
+        <exmo:boitemel>carol1@gmail.com</exmo:boitemel>
+        <exmo:boitemel>carol1@msn.com</exmo:boitemel>
+    </rdf:Description>
+
+
+    <rdf:Description
+        rdf:about="http://exmo.inrialpes.fr/connectors-data/people#carol_c3_1">
+        <rdf:type rdf:resource="&exmo;Personne"/>
+        <exmo:nom>CarolC3</exmo:nom>
+        <exmo:nom>CarolC3_1</exmo:nom>
+        <exmo:nom>CarolC3_2</exmo:nom>
+        <exmo:nom>CarolC3_3</exmo:nom>
+        <exmo:nom>CarolC3_4_diff</exmo:nom>
+        <exmo:nom>CarolC3_5</exmo:nom>
+        <exmo:boitemel>carol1@gmail.com</exmo:boitemel>
+        <exmo:boitemel>carol1@msn.com</exmo:boitemel>
+    </rdf:Description>
+
+    <rdf:Description
+        rdf:about="http://exmo.inrialpes.fr/connectors-data/people#carol_c4_1">
+        <rdf:type rdf:resource="&exmo;Personne"/>
+        <exmo:nom>CarolC4</exmo:nom>
+        <exmo:nom>CarolC4_1_diff</exmo:nom>
+        <exmo:nom>CarolC4_2</exmo:nom>
+        <exmo:nom>CarolC4_3_diff</exmo:nom>
+        <exmo:nom>CarolC4_4_diff</exmo:nom>
+        <exmo:nom>CarolC4_5</exmo:nom>
+        <exmo:boitemel>carol1@gmail.com</exmo:boitemel>
+        <exmo:boitemel>carol1@msn.com</exmo:boitemel>
+    </rdf:Description>
+
+
+    <rdf:Description
+        rdf:about="http://exmo.inrialpes.fr/connectors-data/people#ivan_1"><!-- UNIQ -->
+        <rdf:type rdf:resource="&exmo;Personne"/>
+        <exmo:nom>Ivan1</exmo:nom>
+        <exmo:boitemel>ivan@gmail.com</exmo:boitemel>
+    </rdf:Description>
+
+</rdf:RDF>
diff --git a/test/input/equals_people_2.rdf b/test/input/equals_people_2.rdf
new file mode 100644
index 0000000000000000000000000000000000000000..3b0e3c6899e92350492a14854cec7f3b62173891
--- /dev/null
+++ b/test/input/equals_people_2.rdf
@@ -0,0 +1,183 @@
+<?xml version="1.0"?>
+<!DOCTYPE rdf:RDF [
+    <!ENTITY owl "http://www.w3.org/2002/07/owl#" >
+    <!ENTITY xsd "http://www.w3.org/2001/XMLSchema#" >
+    <!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#" >
+    <!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#" >
+    <!ENTITY foaf "http://xmlns.com/foaf/0.1/" >
+]>
+<rdf:RDF xmlns="http://exmo.inrialpes.fr/connectors-data/people/"
+     xml:base="http://exmo.inrialpes.fr/connectors-data/people/"
+     xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
+     xmlns:foaf="http://xmlns.com/foaf/0.1/"
+     xmlns:owl="http://www.w3.org/2002/07/owl#"
+     xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
+     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+    <owl:Ontology rdf:about="http://exmo.inrialpes.fr/connectors-data/people/">
+      <owl:imports rdf:resource="http://xmlns.com/foaf/0.1/"/>
+    </owl:Ontology>
+
+
+    <rdf:Description rdf:about="http://exmo.inrialpes.fr/connectors-data/people#alice_c1_2">
+        <rdf:type rdf:resource="&foaf;Person"/>
+        <foaf:givenName>AliceC1</foaf:givenName>
+        <foaf:givenName>AliceC1_1</foaf:givenName>
+        <foaf:givenName>AliceC1_2</foaf:givenName>
+        <foaf:mbox>alice2@gmail.com</foaf:mbox>
+        <foaf:mbox>alice2@msn.com</foaf:mbox>
+    </rdf:Description>
+
+    <rdf:Description rdf:about="http://exmo.inrialpes.fr/connectors-data/people#alice_c2_2">
+        <rdf:type rdf:resource="&foaf;Person"/>
+        <foaf:givenName>AliceC2</foaf:givenName>
+        <foaf:givenName>AliceC2_1</foaf:givenName>
+        <foaf:givenName>AliceC2_2_diff</foaf:givenName>
+        <foaf:mbox>alice2@gmail.com</foaf:mbox>
+        <foaf:mbox>alice2@msn.com</foaf:mbox>
+    </rdf:Description>
+    
+    <rdf:Description rdf:about="http://exmo.inrialpes.fr/connectors-data/people#alice_c3_2">
+        <rdf:type rdf:resource="&foaf;Person"/>
+        <foaf:givenName>AliceC3</foaf:givenName>
+        <foaf:givenName>AliceC3_1_diff</foaf:givenName>
+        <foaf:givenName>AliceC3_2</foaf:givenName>
+        <foaf:givenName>AliceC3_3_diff</foaf:givenName>
+        <foaf:givenName>AliceC3_4</foaf:givenName>
+        <foaf:givenName>AliceC3_5_diff</foaf:givenName>
+        <foaf:givenName>AliceC3_6</foaf:givenName>
+        <foaf:mbox>alice1@gmail.com</foaf:mbox>
+        <foaf:mbox>alice1@msn.com</foaf:mbox>
+    </rdf:Description>
+
+    <rdf:Description rdf:about="http://exmo.inrialpes.fr/connectors-data/people#alice_c4_2"><!-- INTERSECTS -->
+        <rdf:type rdf:resource="&foaf;Person"/>
+        <foaf:givenName>AliceC4</foaf:givenName>
+        <foaf:givenName>AliceC4_1_diff</foaf:givenName>
+        <foaf:givenName>AliceC4_2_diff</foaf:givenName>
+        <foaf:givenName>AliceC4_3_diff</foaf:givenName>
+        <foaf:givenName>AliceC4_4_diff</foaf:givenName>
+        <foaf:givenName>AliceC4_5_diff</foaf:givenName>
+        <foaf:givenName>AliceC4_6_diff</foaf:givenName>
+        <foaf:mbox>alice1@gmail.com</foaf:mbox>
+        <foaf:mbox>alice1@msn.com</foaf:mbox>
+    </rdf:Description>
+
+    <rdf:Description rdf:about="http://exmo.inrialpes.fr/connectors-data/people#dave_c1_2">
+        <rdf:type rdf:resource="&foaf;Person"/>
+        <foaf:givenName>DaveC1</foaf:givenName>
+        <foaf:givenName>DaveC1_1</foaf:givenName>
+        <foaf:givenName>DaveC1_2</foaf:givenName>
+        <foaf:givenName>DaveC1_3</foaf:givenName>
+        <foaf:givenName>DaveC1_4</foaf:givenName>
+        <foaf:givenName>DaveC1_5</foaf:givenName>
+        <foaf:mbox>dave@gmail.com</foaf:mbox>
+        <foaf:mbox>dave2@msn.com</foaf:mbox>
+    </rdf:Description>
+
+    <rdf:Description rdf:about="http://exmo.inrialpes.fr/connectors-data/people#dave_c2_2">
+        <rdf:type rdf:resource="&foaf;Person"/>
+        <foaf:givenName>DaveC2</foaf:givenName>
+        <foaf:givenName>DaveC2_1</foaf:givenName>
+        <foaf:givenName>DaveC2_2</foaf:givenName>
+        <foaf:givenName>DaveC2_3_diff</foaf:givenName>
+        <foaf:givenName>DaveC2_4</foaf:givenName>
+        <foaf:givenName>DaveC2_5</foaf:givenName>
+        <foaf:mbox>dave@gmail.com</foaf:mbox>
+        <foaf:mbox>dave2@msn.com</foaf:mbox>
+    </rdf:Description>
+
+    <rdf:Description
+        rdf:about="http://exmo.inrialpes.fr/connectors-data/people#dave_c3_2">
+        <rdf:type rdf:resource="&foaf;Person"/>
+        <foaf:givenName>DaveC3</foaf:givenName>
+        <foaf:givenName>DaveC3_1</foaf:givenName>
+        <foaf:givenName>DaveC3_2_diff</foaf:givenName>
+        <foaf:givenName>DaveC3_3</foaf:givenName>
+        <foaf:givenName>DaveC3_4_diff</foaf:givenName>
+        <foaf:givenName>DaveC3_5</foaf:givenName>
+        <foaf:mbox>dave@gmail.com</foaf:mbox>
+        <foaf:mbox>dave1@msn.com</foaf:mbox>
+    </rdf:Description>
+
+
+    <rdf:Description
+        rdf:about="http://exmo.inrialpes.fr/connectors-data/people#dave_c4_2">
+        <rdf:type rdf:resource="&foaf;Person"/>
+        <foaf:givenName>DaveC4</foaf:givenName>
+        <foaf:givenName>DaveC4_1_diff</foaf:givenName>
+        <foaf:givenName>DaveC4_2_diff</foaf:givenName>
+        <foaf:givenName>DaveC4_3_diff</foaf:givenName>
+        <foaf:givenName>DaveC4_4_diff</foaf:givenName>
+        <foaf:givenName>DaveC4_5_diff</foaf:givenName>
+        <foaf:givenName>DaveC4_6_diff</foaf:givenName>
+        <foaf:mbox>dave@gmail.com</foaf:mbox>
+        <foaf:mbox>dave1@msn.com</foaf:mbox>
+    </rdf:Description>
+
+
+    <rdf:Description
+        rdf:about="http://exmo.inrialpes.fr/connectors-data/people#carol_c1_2">
+        <rdf:type rdf:resource="&foaf;Person"/>
+        <foaf:givenName>CarolC1</foaf:givenName>
+        <foaf:givenName>CarolC1_1</foaf:givenName>
+        <foaf:givenName>CarolC1_2</foaf:givenName>
+        <foaf:givenName>CarolC1_3</foaf:givenName>
+        <foaf:givenName>CarolC1_4</foaf:givenName>
+        <foaf:givenName>CarolC1_5</foaf:givenName>
+        <foaf:givenName>CarolC1_6</foaf:givenName>
+        <foaf:mbox>carol1@gmail.com</foaf:mbox>
+        <foaf:mbox>carol1@msn.com</foaf:mbox>
+    </rdf:Description>
+
+    <rdf:Description
+        rdf:about="http://exmo.inrialpes.fr/connectors-data/people#carol_c2_2">
+        <rdf:type rdf:resource="&foaf;Person"/>
+        <foaf:givenName>CarolC2</foaf:givenName>
+        <foaf:givenName>CarolC2_1</foaf:givenName>
+        <foaf:givenName>CarolC2_2</foaf:givenName>
+        <foaf:givenName>CarolC2_3</foaf:givenName>
+        <foaf:givenName>CarolC2_4</foaf:givenName>
+        <foaf:givenName>CarolC2_5_diff</foaf:givenName>
+        <foaf:givenName>CarolC2_6</foaf:givenName>
+        <foaf:mbox>carol1@gmail.com</foaf:mbox>
+        <foaf:mbox>carol1@msn.com</foaf:mbox>
+    </rdf:Description>
+
+    <rdf:Description
+        rdf:about="http://exmo.inrialpes.fr/connectors-data/people#carol_c3_2">
+        <rdf:type rdf:resource="&foaf;Person"/>
+        <foaf:givenName>CarolC3</foaf:givenName>
+        <foaf:givenName>CarolC3_1</foaf:givenName>
+        <foaf:givenName>CarolC3_2_diff</foaf:givenName>
+        <foaf:givenName>CarolC3_3</foaf:givenName>
+        <foaf:givenName>CarolC3_4</foaf:givenName>
+        <foaf:givenName>CarolC3_5_diff</foaf:givenName>
+        <foaf:givenName>CarolC3_6</foaf:givenName>
+        <foaf:mbox>carol1@gmail.com</foaf:mbox>
+        <foaf:mbox>carol1@msn.com</foaf:mbox>
+    </rdf:Description>
+
+    <rdf:Description
+        rdf:about="http://exmo.inrialpes.fr/connectors-data/people#carol_c4_2">
+        <rdf:type rdf:resource="&foaf;Person"/>
+        <foaf:givenName>CarolC4</foaf:givenName>
+        <foaf:givenName>CarolC4_1</foaf:givenName>
+        <foaf:givenName>CarolC4_2_diff</foaf:givenName>
+        <foaf:givenName>CarolC4_3</foaf:givenName>
+        <foaf:givenName>CarolC4_4</foaf:givenName>
+        <foaf:givenName>CarolC4_5_diff</foaf:givenName>
+        <foaf:givenName>CarolC4_6</foaf:givenName>
+        <foaf:mbox>carol1@gmail.com</foaf:mbox>
+        <foaf:mbox>carol1@msn.com</foaf:mbox>
+    </rdf:Description>
+
+
+    <rdf:Description
+        rdf:about="http://exmo.inrialpes.fr/connectors-data/people#ivan_2"><!-- UNIQ -->
+        <rdf:type rdf:resource="&foaf;Person"/>
+        <foaf:givenName>Ivan2</foaf:givenName>
+        <foaf:mbox>ivan@gmail.com</foaf:mbox>
+    </rdf:Description>
+
+
+</rdf:RDF>
diff --git a/test/input/intersects_people_1.rdf b/test/input/intersects_people_1.rdf
new file mode 100644
index 0000000000000000000000000000000000000000..dd7779efdc029b8789f34c0efeab439548720f49
--- /dev/null
+++ b/test/input/intersects_people_1.rdf
@@ -0,0 +1,62 @@
+<?xml version="1.0"?>
+<!DOCTYPE rdf:RDF [
+    <!ENTITY owl "http://www.w3.org/2002/07/owl#" >
+    <!ENTITY xsd "http://www.w3.org/2001/XMLSchema#" >
+    <!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#" >
+    <!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#" >
+    <!ENTITY foaf "http://xmlns.com/foaf/0.1/" >
+    <!ENTITY exmo "http://exmo.inrialpes.fr/connectors-core/" >
+]>
+<rdf:RDF xmlns="http://exmo.inrialpes.fr/connectors-data/people/"
+     xml:base="http://exmo.inrialpes.fr/connectors-data/people/"
+     xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
+     xmlns:foaf="http://xmlns.com/foaf/0.1/"
+     xmlns:exmo="http://exmo.inrialpes.fr/connectors-core/"
+     xmlns:owl="http://www.w3.org/2002/07/owl#"
+     xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
+     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+    <owl:Ontology rdf:about="http://exmo.inrialpes.fr/connectors-data/people/">
+      <owl:imports rdf:resource="http://xmlns.com/foaf/0.1/"/>
+    </owl:Ontology>
+
+
+    <rdf:Description rdf:about="http://exmo.inrialpes.fr/connectors-data/people#alice_c1_1"><!-- EQUALS -->
+        <rdf:type rdf:resource="&exmo;Personne"/>
+        <exmo:nom>AliceC1</exmo:nom>
+        <exmo:nom>AliceC1_1</exmo:nom>
+        <exmo:nom>AliceC1_2</exmo:nom>
+        <exmo:boitemel>alice1@gmail.com</exmo:boitemel>
+        <exmo:boitemel>alice1@msn.com</exmo:boitemel>
+    </rdf:Description>
+
+    <rdf:Description rdf:about="http://exmo.inrialpes.fr/connectors-data/people#alice_c2_1"><!-- INTERSECTS on AliceC2-->
+        <rdf:type rdf:resource="&exmo;Personne"/>
+        <exmo:nom>AliceC2</exmo:nom>
+        <exmo:nom>AliceC2_1</exmo:nom>
+        <exmo:nom>AliceC2_2</exmo:nom>
+        <exmo:boitemel>alice1@gmail.com</exmo:boitemel>
+        <exmo:boitemel>alice1@msn.com</exmo:boitemel>
+    </rdf:Description>
+
+    <rdf:Description rdf:about="http://exmo.inrialpes.fr/connectors-data/people#alice_c3_1"><!-- NOTHING -->
+        <rdf:type rdf:resource="&exmo;Personne"/>
+        <exmo:nom>AliceC3_1</exmo:nom>
+        <exmo:nom>AliceC3_2</exmo:nom>
+        <exmo:nom>AliceC3_3</exmo:nom>
+        <exmo:nom>AliceC3_4</exmo:nom>
+        <exmo:nom>AliceC3_5</exmo:nom>
+        <exmo:nom>AliceC3_6</exmo:nom>
+        <exmo:boitemel>alice1@gmail.com</exmo:boitemel>
+        <exmo:boitemel>alice1@msn.com</exmo:boitemel>
+    </rdf:Description>
+
+
+
+    <rdf:Description
+        rdf:about="http://exmo.inrialpes.fr/connectors-data/people#ivan_1"><!-- UNIQ -->
+        <rdf:type rdf:resource="&exmo;Personne"/>
+        <exmo:nom>Ivan1</exmo:nom>
+        <exmo:boitemel>ivan@gmail.com</exmo:boitemel>
+    </rdf:Description>
+
+</rdf:RDF>
diff --git a/test/input/intersects_people_2.rdf b/test/input/intersects_people_2.rdf
new file mode 100644
index 0000000000000000000000000000000000000000..8b0f13453e7ee0c20b8439d523c13a85361d7acc
--- /dev/null
+++ b/test/input/intersects_people_2.rdf
@@ -0,0 +1,72 @@
+<?xml version="1.0"?>
+<!DOCTYPE rdf:RDF [
+    <!ENTITY owl "http://www.w3.org/2002/07/owl#" >
+    <!ENTITY xsd "http://www.w3.org/2001/XMLSchema#" >
+    <!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#" >
+    <!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#" >
+    <!ENTITY foaf "http://xmlns.com/foaf/0.1/" >
+]>
+<rdf:RDF xmlns="http://exmo.inrialpes.fr/connectors-data/people/"
+     xml:base="http://exmo.inrialpes.fr/connectors-data/people/"
+     xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
+     xmlns:foaf="http://xmlns.com/foaf/0.1/"
+     xmlns:owl="http://www.w3.org/2002/07/owl#"
+     xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
+     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+    <owl:Ontology rdf:about="http://exmo.inrialpes.fr/connectors-data/people/">
+      <owl:imports rdf:resource="http://xmlns.com/foaf/0.1/"/>
+    </owl:Ontology>
+
+
+    <rdf:Description rdf:about="http://exmo.inrialpes.fr/connectors-data/people#alice_c1_2"><!-- EQUALS -->
+        <rdf:type rdf:resource="&foaf;Person"/>
+        <foaf:givenName>AliceC1</foaf:givenName>
+        <foaf:givenName>AliceC1_1</foaf:givenName>
+        <foaf:givenName>AliceC1_2</foaf:givenName>
+        <foaf:mbox>alice2@gmail.com</foaf:mbox>
+        <foaf:mbox>alice2@msn.com</foaf:mbox>
+    </rdf:Description>
+
+    <rdf:Description rdf:about="http://exmo.inrialpes.fr/connectors-data/people#alice_c2_2"><!-- INTERSECTS on AliceC2-->
+        <rdf:type rdf:resource="&foaf;Person"/>
+        <foaf:givenName>AliceC2</foaf:givenName>
+        <foaf:givenName>AliceC2_1_diff</foaf:givenName>
+        <foaf:givenName>AliceC2_2_diff</foaf:givenName>
+        <foaf:mbox>alice2@gmail.com</foaf:mbox>
+        <foaf:mbox>alice2@msn.com</foaf:mbox>
+    </rdf:Description>
+    
+    <rdf:Description rdf:about="http://exmo.inrialpes.fr/connectors-data/people#alice_c3_2"><!-- UNIQ -->
+        <rdf:type rdf:resource="&foaf;Person"/>
+        <foaf:givenName>AliceC3_1_diff</foaf:givenName>
+        <foaf:givenName>AliceC3_2_diff</foaf:givenName>
+        <foaf:givenName>AliceC3_3_diff</foaf:givenName>
+        <foaf:givenName>AliceC3_4_diff</foaf:givenName>
+        <foaf:givenName>AliceC3_5_diff</foaf:givenName>
+        <foaf:givenName>AliceC3_6_diff</foaf:givenName>
+        <foaf:mbox>alice1@gmail.com</foaf:mbox>
+        <foaf:mbox>alice1@msn.com</foaf:mbox>
+    </rdf:Description>
+
+    <rdf:Description rdf:about="http://exmo.inrialpes.fr/connectors-data/people#alice_c4_2"><!-- UNIQ -->
+        <rdf:type rdf:resource="&foaf;Person"/>
+        <foaf:givenName>AliceC4</foaf:givenName>
+        <foaf:givenName>AliceC4_1_diff</foaf:givenName>
+        <foaf:givenName>AliceC4_2_diff</foaf:givenName>
+        <foaf:givenName>AliceC4_3_diff</foaf:givenName>
+        <foaf:givenName>AliceC4_4_diff</foaf:givenName>
+        <foaf:givenName>AliceC4_5_diff</foaf:givenName>
+        <foaf:givenName>AliceC4_6_diff</foaf:givenName>
+        <foaf:mbox>alice1@gmail.com</foaf:mbox>
+        <foaf:mbox>alice1@msn.com</foaf:mbox>
+    </rdf:Description>
+
+    <rdf:Description
+        rdf:about="http://exmo.inrialpes.fr/connectors-data/people#ivan_2"><!-- UNIQ -->
+        <rdf:type rdf:resource="&foaf;Person"/>
+        <foaf:givenName>Ivan2</foaf:givenName>
+        <foaf:mbox>ivan@gmail.com</foaf:mbox>
+    </rdf:Description>
+
+
+</rdf:RDF>
diff --git a/test/input/people_equals_alignment.rdf b/test/input/people_equals_alignment.rdf
new file mode 100644
index 0000000000000000000000000000000000000000..7b7f516fca772b099944762738a931ec6957031b
--- /dev/null
+++ b/test/input/people_equals_alignment.rdf
@@ -0,0 +1,64 @@
+<?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:ns0='http://exmo.inrialpes.fr/align/service#'
+         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/#'>
+    <Alignment rdf:about="http://localhost:8089/alid/1394718240757/976">
+        <xml>yes</xml>
+        <level>2EDOAL</level>
+        <type>?*</type>
+        <pretty>test1</pretty>
+        <ns0:cached>Thu Mar 13 14:44:05 CET 2014</ns0:cached>
+        <ns0:stored>null</ns0:stored>
+        <time>34</time>
+        <ns0:ouri2>http://purl.org/ontology/mo/</ns0:ouri2>
+        <id>http://localhost:8089/alid/1394718240757/976</id>
+        <ns0:ouri1>http://exmo.inrialpes.fr/connectors/example_musical_work_desc/</ns0:ouri1>
+        <method>fr.inrialpes.exmo.align.impl.method.SubsDistNameAlignment</method>
+        <onto1>
+            <Ontology rdf:about="http://exmo.inrialpes.fr/connectors/example_musical_work_desc/">
+                <location>/home/tests/example_musical_work_desc.owl</location>
+                <formalism>
+                    <Formalism align:name="OWL2.0" align:uri="http://www.w3.org/2002/07/owl#"/>
+                </formalism>
+            </Ontology>
+        </onto1>
+        <onto2>
+            <Ontology rdf:about="http://purl.org/ontology/mo/">
+                <location>http://purl.org/ontology/mo/</location>
+                <formalism>
+                    <Formalism align:name="OWL2.0" align:uri="http://www.w3.org/2002/07/owl#"/>
+                </formalism>
+            </Ontology>
+        </onto2>
+        <map>
+            <Cell rdf:about="http://exmo.inrialpes.fr/connectors#cell1">
+                <entity1>
+                  <edoal:Class rdf:about="http://exmo.inrialpes.fr/connectors-core/Personne"/>
+                </entity1>
+                <entity2>
+                  <edoal:Class rdf:about="http://xmlns.com/foaf/0.1/Person"/>
+                </entity2>
+                <relation>=</relation>
+                <measure rdf:datatype='http://www.w3.org/2001/XMLSchema#float'>1.0</measure>
+                <edoal:linkkey> 
+                    <edoal:Linkkey>
+                        <!--<edoal:type>weak</edoal:type>-->
+                        <edoal:binding>
+                            <edoal:Equals>
+                                <edoal:property1>
+                                    <edoal:Property rdf:about="http://exmo.inrialpes.fr/connectors-core/nom" />
+                                </edoal:property1>
+                                <edoal:property2>
+                                    <edoal:Property rdf:about="http://xmlns.com/foaf/0.1/givenName" />
+                                </edoal:property2>
+                            </edoal:Equals>
+                        </edoal:binding>
+                    </edoal:Linkkey>
+                </edoal:linkkey>
+            </Cell>
+        </map>
+    </Alignment>
+</rdf:RDF>
diff --git a/test/input/people_intersects_alignment.rdf b/test/input/people_intersects_alignment.rdf
new file mode 100644
index 0000000000000000000000000000000000000000..e6f6a49e7ae473e291cf7938359c8f429f439039
--- /dev/null
+++ b/test/input/people_intersects_alignment.rdf
@@ -0,0 +1,64 @@
+<?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:ns0='http://exmo.inrialpes.fr/align/service#'
+         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/#'>
+    <Alignment rdf:about="http://localhost:8089/alid/1394718240757/976">
+        <xml>yes</xml>
+        <level>2EDOAL</level>
+        <type>?*</type>
+        <pretty>test1</pretty>
+        <ns0:cached>Thu Mar 13 14:44:05 CET 2014</ns0:cached>
+        <ns0:stored>null</ns0:stored>
+        <time>34</time>
+        <ns0:ouri2>http://purl.org/ontology/mo/</ns0:ouri2>
+        <id>http://localhost:8089/alid/1394718240757/976</id>
+        <ns0:ouri1>http://exmo.inrialpes.fr/connectors/example_musical_work_desc/</ns0:ouri1>
+        <method>fr.inrialpes.exmo.align.impl.method.SubsDistNameAlignment</method>
+        <onto1>
+            <Ontology rdf:about="http://exmo.inrialpes.fr/connectors/example_musical_work_desc/">
+                <location>/home/tests/example_musical_work_desc.owl</location>
+                <formalism>
+                    <Formalism align:name="OWL2.0" align:uri="http://www.w3.org/2002/07/owl#"/>
+                </formalism>
+            </Ontology>
+        </onto1>
+        <onto2>
+            <Ontology rdf:about="http://purl.org/ontology/mo/">
+                <location>http://purl.org/ontology/mo/</location>
+                <formalism>
+                    <Formalism align:name="OWL2.0" align:uri="http://www.w3.org/2002/07/owl#"/>
+                </formalism>
+            </Ontology>
+        </onto2>
+        <map>
+            <Cell rdf:about="http://exmo.inrialpes.fr/connectors#cell1">
+                <entity1>
+                  <edoal:Class rdf:about="http://exmo.inrialpes.fr/connectors-core/Personne"/>
+                </entity1>
+                <entity2>
+                  <edoal:Class rdf:about="http://xmlns.com/foaf/0.1/Person"/>
+                </entity2>
+                <relation>=</relation>
+                <measure rdf:datatype='http://www.w3.org/2001/XMLSchema#float'>1.0</measure>
+                <edoal:linkkey> 
+                    <edoal:Linkkey>
+                        <!--<edoal:type>weak</edoal:type>-->
+                        <edoal:binding>
+                            <edoal:Intersects>
+                                <edoal:property1>
+                                    <edoal:Property rdf:about="http://exmo.inrialpes.fr/connectors-core/nom" />
+                                </edoal:property1>
+                                <edoal:property2>
+                                    <edoal:Property rdf:about="http://xmlns.com/foaf/0.1/givenName" />
+                                </edoal:property2>
+                            </edoal:Intersects>
+                        </edoal:binding>
+                    </edoal:Linkkey>
+                </edoal:linkkey>
+            </Cell>
+        </map>
+    </Alignment>
+</rdf:RDF>
diff --git a/test/src/SPARQLConstructVisitorTest.java b/test/src/SPARQLConstructVisitorTest.java
index c68bb1ac1c0a6ff9b976c17b15e865b37e254db1..966d1aca869deb6eaca0d511b6bb92d959db34f6 100644
--- a/test/src/SPARQLConstructVisitorTest.java
+++ b/test/src/SPARQLConstructVisitorTest.java
@@ -57,16 +57,6 @@ public class SPARQLConstructVisitorTest {
         alignment.render(renderer);
 
         String expectedQuery1 = "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n"
-                + "PREFIX ns0:<http://exmo.inrialpes.fr/connectors#>\n"
-                + "PREFIX ns1:<http://purl.org/ontology/mo/>\n"
-                + "CONSTRUCT {\n"
-                + "?s ns0:opus ?o .\n"
-                + "}\n"
-                + "WHERE {\n"
-                + "?s ns1:opus ?o .\n"
-                + "}\n";
-
-        String expectedQuery2 = "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n"
                 + "PREFIX ns0:<http://exmo.inrialpes.fr/connectors#>\n"
                 + "PREFIX ns1:<http://purl.org/ontology/mo/>\n"
                 + "CONSTRUCT {\n"
@@ -75,39 +65,52 @@ public class SPARQLConstructVisitorTest {
                 + "WHERE {\n"
                 + "?s ns0:opus ?o .\n"
                 + "}\n";
-        assertEquals(renderer.getQuery(opusCell, 0), expectedQuery1);
-        assertEquals(renderer.getQuery(opusCell, 1), expectedQuery2);
-        
-        //For remote sparql endpoint : 
         
-        
-        String remoteServiceURIName = "http://example.org/remoteSparql";
-        URI remoteServiceURI = new URI(remoteServiceURIName);
-        expectedQuery1 = String.format("PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n"
+        String expectedQuery2 = "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n"
                 + "PREFIX ns0:<http://exmo.inrialpes.fr/connectors#>\n"
                 + "PREFIX ns1:<http://purl.org/ontology/mo/>\n"
                 + "CONSTRUCT {\n"
                 + "?s ns0:opus ?o .\n"
                 + "}\n"
                 + "WHERE {\n"
-                + "SERVICE <%s> {\n"
                 + "?s ns1:opus ?o .\n"
-                + "}\n"
-                + "}\n", remoteServiceURIName);
+                + "}\n";
 
-        expectedQuery2 = String.format("PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n"
-                + "PREFIX ns0:<http://exmo.inrialpes.fr/connectors#>\n"
-                + "PREFIX ns1:<http://purl.org/ontology/mo/>\n"
-                + "CONSTRUCT {\n"
-                + "?s ns1:opus ?o .\n"
-                + "}\n"
-                + "WHERE {\n"
-                + "SERVICE <%s> {\n"
-                + "?s ns0:opus ?o .\n"
-                + "}\n"
-                + "}\n", remoteServiceURIName);
-        assertEquals(renderer.getQuery(opusCell, 0, remoteServiceURI), expectedQuery1);
-        assertEquals(renderer.getQuery(opusCell, 1, remoteServiceURI), expectedQuery2);
+        
+        assertEquals(renderer.getQueryFromOnto1ToOnto2(opusCell), expectedQuery1);
+        assertEquals(renderer.getQueryFromOnto2ToOnto1(opusCell), expectedQuery2);
+        
+        //For remote sparql endpoint : 
+        
+//        String remoteServiceURIName = "http://example.org/remoteSparql";
+//        URI remoteServiceURI = new URI(remoteServiceURIName);
+//
+//        expectedQuery1 = String.format("PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n"
+//                + "PREFIX ns0:<http://exmo.inrialpes.fr/connectors#>\n"
+//                + "PREFIX ns1:<http://purl.org/ontology/mo/>\n"
+//                + "CONSTRUCT {\n"
+//                + "?s ns1:opus ?o .\n"
+//                + "}\n"
+//                + "WHERE {\n"
+//                + "SERVICE <%s> {\n"
+//                + "?s ns0:opus ?o .\n"
+//                + "}\n"
+//                + "}\n", remoteServiceURIName);
+//        
+//        expectedQuery2 = String.format("PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n"
+//                + "PREFIX ns0:<http://exmo.inrialpes.fr/connectors#>\n"
+//                + "PREFIX ns1:<http://purl.org/ontology/mo/>\n"
+//                + "CONSTRUCT {\n"
+//                + "?s ns0:opus ?o .\n"
+//                + "}\n"
+//                + "WHERE {\n"
+//                + "SERVICE <%s> {\n"
+//                + "?s ns1:opus ?o .\n"
+//                + "}\n"
+//                + "}\n", remoteServiceURIName);
+//        
+//        assertEquals(renderer.getQueryFromOnto1ToOnto2(opusCell, remoteServiceURI), expectedQuery1);
+//        assertEquals(renderer.getQueryFromOnto2ToOnto1(opusCell, remoteServiceURI), expectedQuery2);
     }
 
     /**
@@ -131,27 +134,29 @@ public class SPARQLConstructVisitorTest {
         renderer.init(properties);
         alignment.render(renderer);
 
+
         String expectedQuery1 = "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n"
                 + "PREFIX ns0:<http://exmo.inrialpes.fr/connectors#>\n"
                 + "PREFIX ns1:<http://purl.org/ontology/mo/>\n"
                 + "CONSTRUCT {\n"
-                + "?s rdf:type ns0:RootElement .\n"
+                + "?s rdf:type ns1:MusicalWork .\n"
                 + "}\n"
                 + "WHERE {\n"
-                + "?s rdf:type ns1:MusicalWork .\n"
+                + "?s rdf:type ns0:RootElement .\n"
                 + "}\n";
-
+        
         String expectedQuery2 = "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n"
                 + "PREFIX ns0:<http://exmo.inrialpes.fr/connectors#>\n"
                 + "PREFIX ns1:<http://purl.org/ontology/mo/>\n"
                 + "CONSTRUCT {\n"
-                + "?s rdf:type ns1:MusicalWork .\n"
+                + "?s rdf:type ns0:RootElement .\n"
                 + "}\n"
                 + "WHERE {\n"
-                + "?s rdf:type ns0:RootElement .\n"
+                + "?s rdf:type ns1:MusicalWork .\n"
                 + "}\n";
-        assertEquals(renderer.getQuery(classCell, 0), expectedQuery1);
-        assertEquals(renderer.getQuery(classCell, 1), expectedQuery2);
+        
+        assertEquals(renderer.getQueryFromOnto1ToOnto2(classCell), expectedQuery1);
+        assertEquals(renderer.getQueryFromOnto2ToOnto1(classCell), expectedQuery2);
     }
 
     @Test(groups = {"full", "impl", "raw"})
@@ -169,35 +174,36 @@ public class SPARQLConstructVisitorTest {
             Enumeration<Cell> cells = alignment.getElements();
             Cell cell = cells.nextElement();
 
+
             String expectedQuery1 = "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n"
                     + "PREFIX ns1:<http://purl.org/NET/c4dm/keys.owl#>\n"
                     + "PREFIX ns0:<http://exmo.inrialpes.fr/connectors#>\n"
                     + "PREFIX ns3:<http://www.w3.org/2000/01/rdf-schema#>\n"
                     + "PREFIX ns2:<http://purl.org/ontology/mo/>\n"
                     + "CONSTRUCT {\n"
-                    + "?s ns0:key ?o .\n"
+                    + "_:o3 rdf:type ns1:Key .\n"
+                    + "_:o3 ns2:key _:o4 .\n"
+                    + "_:o4 ns3:label ?o .\n"
                     + "}\n"
                     + "WHERE {\n"
-                    + "?o3 rdf:type ns1:Key .\n"
-                    + "?o3 ns2:key ?o4 .\n"
-                    + "?o4 ns3:label ?o .\n"
+                    + "?s ns0:key ?o .\n"
                     + "}\n";
-
+            
             String expectedQuery2 = "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n"
                     + "PREFIX ns1:<http://purl.org/NET/c4dm/keys.owl#>\n"
                     + "PREFIX ns0:<http://exmo.inrialpes.fr/connectors#>\n"
                     + "PREFIX ns3:<http://www.w3.org/2000/01/rdf-schema#>\n"
                     + "PREFIX ns2:<http://purl.org/ontology/mo/>\n"
                     + "CONSTRUCT {\n"
-                    + "_:o3 rdf:type ns1:Key .\n"
-                    + "_:o3 ns2:key _:o4 .\n"
-                    + "_:o4 ns3:label ?o .\n"
+                    + "?s ns0:key ?o .\n"
                     + "}\n"
                     + "WHERE {\n"
-                    + "?s ns0:key ?o .\n"
+                    + "?o3 rdf:type ns1:Key .\n"
+                    + "?o3 ns2:key ?o4 .\n"
+                    + "?o4 ns3:label ?o .\n"
                     + "}\n";
-            assertEquals(renderer.getQuery(cell, 0), expectedQuery1, "FOR alignment file " + alignmentFileName);
-            assertEquals(renderer.getQuery(cell, 1), expectedQuery2, "FOR alignment file " + alignmentFileName);
+            assertEquals(renderer.getQueryFromOnto1ToOnto2(cell), expectedQuery1, "FOR alignment file " + alignmentFileName);
+            assertEquals(renderer.getQueryFromOnto2ToOnto1(cell), expectedQuery2, "FOR alignment file " + alignmentFileName);
         }
     }
 
diff --git a/test/src/SPARQLSelectRendererVisitorTest.java b/test/src/SPARQLSelectRendererVisitorTest.java
index e110cd71cd0d91f8a55cc744b3588abc1cef2718..766e88bcde186047f23fa0b70e0c70cfae7f16d3 100644
--- a/test/src/SPARQLSelectRendererVisitorTest.java
+++ b/test/src/SPARQLSelectRendererVisitorTest.java
@@ -1,14 +1,22 @@
-
+import com.hp.hpl.jena.query.Query;
+import com.hp.hpl.jena.query.QueryExecution;
+import com.hp.hpl.jena.query.QueryExecutionFactory;
+import com.hp.hpl.jena.query.QueryFactory;
+import com.hp.hpl.jena.query.ResultSet;
+import com.hp.hpl.jena.rdf.model.Model;
 import fr.inrialpes.exmo.align.impl.edoal.EDOALAlignment;
 import fr.inrialpes.exmo.align.impl.renderer.SPARQLSelectRendererVisitor;
 import fr.inrialpes.exmo.align.test.Utils;
 import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.net.URI;
+import java.util.Collection;
 import java.util.Enumeration;
+import java.util.HashMap;
 import java.util.Properties;
 import org.semanticweb.owl.align.Cell;
 import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
 import static org.testng.Assert.fail;
 import org.testng.annotations.Test;
 
@@ -18,125 +26,270 @@ import org.testng.annotations.Test;
  */
 public class SPARQLSelectRendererVisitorTest {
 
-//    @Test(groups = {"full", "impl", "raw"})
-//    public void QueryFromWithoutLinkkey() throws Exception {
-//        String alignmentFileName = "alignment3.rdf";
-//        EDOALAlignment alignment = Utils.loadAlignement(alignmentFileName);
-//        StringWriter stringWriter = new StringWriter();
-//        PrintWriter writer = new PrintWriter(stringWriter);
-//        SPARQLSelectRendererVisitor renderer = new SPARQLSelectRendererVisitor(writer);
-//        Properties properties = new Properties();
-//        renderer.init(properties);
-//        alignment.render(renderer);
-//        assertEquals(alignment.nbCells(), 1);
-//        Enumeration<Cell> cells = alignment.getElements();
-//        Cell cell = cells.nextElement();
-//        URI remoteURI = new URI("http://example.org/data.rdf");
-//        
-//        
-//        //Without service => UNSING FROM ?
-//        String expectedQuery1 = "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n"
-//                + "PREFIX ns0:<http://exmo.inria.fr/connectors#>\n"
+    @Test(groups = {"full", "impl", "raw"})
+    public void QueryFromWithoutLinkkey() throws Exception {
+        String alignmentFileName = "alignment3.rdf";
+        EDOALAlignment alignment = Utils.loadAlignement(alignmentFileName);
+        StringWriter stringWriter = new StringWriter();
+        PrintWriter writer = new PrintWriter(stringWriter);
+        SPARQLSelectRendererVisitor renderer = new SPARQLSelectRendererVisitor(writer);
+        Properties properties = new Properties();
+        renderer.init(properties);
+        alignment.render(renderer);
+        assertEquals(alignment.nbCells(), 1);
+        Enumeration<Cell> cells = alignment.getElements();
+        Cell cell = cells.nextElement();
+
+        //Without any service => 
+        String expectedQuery = "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n"
+                + "PREFIX ns0:<http://exmo.inrialpes.fr/connectors#>\n"
+                + "PREFIX ns1:<http://purl.org/ontology/mo/>\n"
+                + "SELECT DISTINCT ?s1 ?s2 \n"
+                + "WHERE {\n"
+                + "?s1 rdf:type ns0:RootElement .\n"
+                + "?s2 rdf:type ns1:MusicalWork .\n"
+                + "FILTER(?s1 != ?s2)\n"
+                + "}\n";
+        assertEquals(renderer.getQueryFromOnto1ToOnto2(cell), expectedQuery);
+
+//        //With service on first
+//        URI remoteURI1 = new URI("http://example.org/data.rdf");
+//        URI remoteURI2 = new URI("http://example2.org/data.rdf");
+//        expectedQuery = "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n"
+//                + "PREFIX ns0:<http://exmo.inrialpes.fr/connectors#>\n"
 //                + "PREFIX ns1:<http://purl.org/ontology/mo/>\n"
 //                + "SELECT ?s1 ?s2"
 //                + "WHERE {\n"
-//                + "?s1 rdf:type ns0:RootElement .\n"
 //                + "SERVICE <http://example.org/data.rdf> {"
-//                + "?s2 rdf:type ns1:MusicalWork . \n"
-//                + "?s2 ns1:opus ?o1"
+//                + "?s1 rdf:type ns0:RootElement .\n"
 //                + "}\n"
+//                + "?s2 rdf:type ns1:MusicalWork .\n"
 //                + "}\n";
-//
-//        String expectedQuery2 = "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n"
-//                + "PREFIX ns0:<http://exmo.inria.fr/connectors#>\n"
+//        assertEquals(renderer.getQuery(cell, remoteURI1, null), expectedQuery);
+//        
+//        //With service on second
+//        expectedQuery = "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n"
+//                + "PREFIX ns0:<http://exmo.inrialpes.fr/connectors#>\n"
 //                + "PREFIX ns1:<http://purl.org/ontology/mo/>\n"
 //                + "SELECT ?s1 ?s2"
 //                + "WHERE {\n"
+//                + "?s1 rdf:type ns0:RootElement .\n"
+//                + "SERVICE <http://example2.org/data.rdf> {"
 //                + "?s2 rdf:type ns1:MusicalWork . \n"
 //                + "?s2 ns1:opus ?o1"
-//                + "SERVICE <http://example.org/data.rdf> {"
-//                + "?s1 rdf:type ns0:RootElement .\n"
-//                + "?s1 ns0:number ?o1 ."
 //                + "}\n"
 //                + "}\n";
-//        assertEquals(renderer.getQuery(cell, 0), expectedQuery1);
-//        assertEquals(renderer.getQuery(cell, 1), expectedQuery2);
+//        assertEquals(renderer.getQuery(cell, null, remoteURI2), expectedQuery);
+//        
 //        
-//        //With service
-//        expectedQuery1 = "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n"
-//                + "PREFIX ns0:<http://exmo.inria.fr/connectors#>\n"
+//        //With service on all
+//        expectedQuery = "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n"
+//                + "PREFIX ns0:<http://exmo.inrialpes.fr/connectors#>\n"
 //                + "PREFIX ns1:<http://purl.org/ontology/mo/>\n"
 //                + "SELECT ?s1 ?s2"
 //                + "WHERE {\n"
+//                + "SERVICE <http://example1.org/data.rdf> {"
 //                + "?s1 rdf:type ns0:RootElement .\n"
-//                + "SERVICE <http://example.org/data.rdf> {"
+//                + "}\n"
+//                + "SERVICE <http://example2.org/data.rdf> {"
 //                + "?s2 rdf:type ns1:MusicalWork . \n"
-//                + "?s2 ns1:opus ?o1"
 //                + "}\n"
 //                + "}\n";
-//
-//        expectedQuery2 = "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n"
-//                + "PREFIX ns0:<http://exmo.inria.fr/connectors#>\n"
+//        assertEquals(renderer.getQuery(cell, remoteURI1, remoteURI2), expectedQuery);
+    }
+
+    @Test(groups = {"full", "impl", "raw"}, dependsOnMethods = {"QueryFromWithoutLinkkey", "QueryFromSimpleLinkkeyFromIntersects"})
+    public void QueryFromSimpleLinkkeyFromEquals() throws Exception {
+        //With Equals Linkkey => throw Exception, I already don't know to do it, could be performances innefficiente ...
+        String alignmentFileName = "people_equals_alignment.rdf";
+        EDOALAlignment alignment = Utils.loadAlignement(alignmentFileName);
+        StringWriter stringWriter = new StringWriter();
+        PrintWriter writer = new PrintWriter(stringWriter);
+        SPARQLSelectRendererVisitor renderer = new SPARQLSelectRendererVisitor(writer);
+        Properties properties = new Properties();
+        renderer.init(properties);
+        alignment.render(renderer);
+
+        assertEquals(alignment.nbCells(), 1);
+        Enumeration<Cell> cells = alignment.getElements();
+        Cell cell = cells.nextElement();
+        //Without any service
+        String expectedQuery = "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n"
+                + "PREFIX ns0:<http://exmo.inrialpes.fr/connectors-core/>\n"
+                + "PREFIX ns1:<http://xmlns.com/foaf/0.1/>\n"
+                + "SELECT DISTINCT ?s1 ?s2 \n"
+                + "WHERE {\n"
+                + "?s1 rdf:type ns0:Personne .\n"
+                + "?s2 rdf:type ns1:Person .\n"
+                + "?s1 ns0:nom ?o1 .\n"
+                + "?s2 ns1:givenName ?o2 .\n"
+                + "MINUS { \n"
+                + "SELECT DISTINCT ?s1 ?s2 \n"
+                + "WHERE \n"
+                + "{ \n"
+                + "?s1 ns0:nom ?o1 .\n"
+                + "?s1 ns0:nom ?o2 .\n"
+                + "?s2 ns1:givenName ?o3 .\n"
+                + "FILTER(?s1 != ?s2 && ?o2 != ?o1 && ?o3 = ?o1 && NOT EXISTS {\n"
+                + "?s2 ns1:givenName ?o2 .\n"
+                + "}) \n"
+                + "} \n"
+                + "} \n"
+                + "MINUS {\n"
+                + "SELECT DISTINCT ?s1 ?s2 \n"
+                + "WHERE \n"
+                + "{ \n"
+                + "?s1 ns0:nom ?o1 .\n"
+                + "?s2 ns1:givenName ?o2 .\n"
+                + "?s2 ns1:givenName ?o3 .\n"
+                + "FILTER(?s1 != ?s2 && ?o2 != ?o3 && ?o2 = ?o1 && NOT EXISTS {\n"
+                + "?s1 ns0:nom ?o3 .\n"
+                + "})\n"
+                + "}\n"
+                + "}\n"
+                + "FILTER(?s1 != ?s2 && ?o2 = ?o1)\n"
+                + "}\n";
+//        System.out.println("QUERY 1 : " + expectedQuery);
+//        System.out.println("QUERY 2 : " + renderer.getQueryFromOnto1ToOnto2(cell));
+        String query = renderer.getQueryFromOnto1ToOnto2(cell);//Where ?p1 is in onto1
+//        System.out.println("QueryFromOnto1ToOnto2 : \n" + query);
+        assertEquals(query, expectedQuery);
+        
+        Model values = Utils.loadValues(new String[]{"equals_people_1.rdf", "equals_people_2.rdf"});
+        Query selectQuery = QueryFactory.create(query);
+        String[] expectedS1 = {
+            "http://exmo.inrialpes.fr/connectors-data/people#alice_c1_1"};
+        String[] expectedS2 = {
+            "http://exmo.inrialpes.fr/connectors-data/people#alice_c1_2",};
+//        Utils.showResultValues(QueryExecutionFactory.create(selectQuery, values).execSelect());
+        HashMap<String, Collection<String>> allResultValues = Utils.getResultValues(QueryExecutionFactory.create(selectQuery, values).execSelect());
+        Collection<String> resultValues = allResultValues.get("s1");
+        assertEquals(resultValues.size(), expectedS1.length);
+        for (String expected : expectedS1) {
+            assertTrue(resultValues.contains(expected), "For expected : " + expected);
+        }
+
+        resultValues = allResultValues.get("s2");
+        assertEquals(resultValues.size(), expectedS2.length);
+        for (String expected : expectedS2) {
+            assertTrue(resultValues.contains(expected), "For expected : " + expected);
+        }
+
+        //With from onto2ToOnto1
+        query = renderer.getQueryFromOnto2ToOnto1(cell);//Where ?p1 is in onto2
+//        System.out.println("QueryFromOnto2ToOnto1 : \n" + query);
+        values = Utils.loadValues(new String[]{"equals_people_1.rdf", "equals_people_2.rdf"});
+        selectQuery = QueryFactory.create(query);
+//        Utils.showResultValues(QueryExecutionFactory.create(selectQuery, values).execSelect());
+        allResultValues = Utils.getResultValues(QueryExecutionFactory.create(selectQuery, values).execSelect());
+        
+        resultValues = allResultValues.get("s1");
+        assertEquals(resultValues.size(), expectedS1.length);
+        for (String expected : expectedS2) {//Change here
+            assertTrue(resultValues.contains(expected), "For expected : " + expected);
+        }
+
+        resultValues = allResultValues.get("s2");
+        assertEquals(resultValues.size(), expectedS2.length);
+        for (String expected : expectedS1) {//Change here
+            assertTrue(resultValues.contains(expected), "For expected : " + expected);
+        }
+        
+        
+//        URI remoteURI1 = new URI("http://example.org/data.rdf");
+//        URI remoteURI2 = new URI("http://example.org/data.rdf");
+//        String expectedQuery = "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n"
+//                + "PREFIX ns0:<http://exmo.inrialpes.fr/connectors#>\n"
 //                + "PREFIX ns1:<http://purl.org/ontology/mo/>\n"
 //                + "SELECT ?s1 ?s2"
 //                + "WHERE {\n"
-//                + "?s2 rdf:type ns1:MusicalWork . \n"
-//                + "?s2 ns1:opus ?o1"
-//                + "SERVICE <http://example.org/data.rdf> {"
+//                + "SERVICE <http://example1.org/data.rdf> {"
 //                + "?s1 rdf:type ns0:RootElement .\n"
 //                + "?s1 ns0:number ?o1 ."
 //                + "}\n"
+//                + "SERVICE <http://example2.org/data.rdf> {"
+//                + "?s2 rdf:type ns1:MusicalWork . \n"
+//                + "?s2 ns1:opus ?o1"
+//                + "}\n"
 //                + "}\n";
-//        assertEquals(renderer.getQuery(cell, 0, remoteURI), expectedQuery1);
-//        assertEquals(renderer.getQuery(cell, 1, remoteURI), expectedQuery2);
-//    }
-//
-//    @Test(groups = {"full", "impl", "raw"}, dependsOnMethods = {"QueryFromWithoutLinkkey"})
-//    public void QueryFromSimpleLinkkey() throws Exception {
-//        String alignmentFileName = "alignment4.rdf";
-//        EDOALAlignment alignment = Utils.loadAlignement(alignmentFileName);
-//        StringWriter stringWriter = new StringWriter();
-//        PrintWriter writer = new PrintWriter(stringWriter);
-//        SPARQLSelectRendererVisitor renderer = new SPARQLSelectRendererVisitor(writer);
-//        Properties properties = new Properties();
-//        renderer.init(properties);
-//        alignment.render(renderer);
-//        assertEquals(alignment.nbCells(), 1);
-//        Enumeration<Cell> cells = alignment.getElements();
-//        Cell cell = cells.nextElement();
-//        URI remoteURI = new URI("http://example.org/data.rdf");
-//        // THIS DOES THE edoal:type="in" How to do equal?
-//        String expectedQuery1 = "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n"
-//                + "PREFIX ns0:<http://exmo.inria.fr/connectors#>\n"
+//        
+//        assertEquals(renderer.getQuery(cell, remoteURI1, remoteURI2), expectedQuery);
+    }
+
+    @Test(groups = {"full", "impl", "raw"}, dependsOnMethods = {"QueryFromWithoutLinkkey"})
+    public void QueryFromSimpleLinkkeyFromIntersects() throws Exception {
+        //With Equals Linkkey => throw Exception, I already don't know to do it, could be performances innefficiente ...
+        String alignmentFileName = "people_intersects_alignment.rdf";
+        EDOALAlignment alignment = Utils.loadAlignement(alignmentFileName);
+        StringWriter stringWriter = new StringWriter();
+        PrintWriter writer = new PrintWriter(stringWriter);
+        SPARQLSelectRendererVisitor renderer = new SPARQLSelectRendererVisitor(writer);
+        Properties properties = new Properties();
+        renderer.init(properties);
+        alignment.render(renderer);
+        assertEquals(alignment.nbCells(), 1);
+        Enumeration<Cell> cells = alignment.getElements();
+        Cell cell = cells.nextElement();
+        //Without any service
+//        PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
+//        PREFIX ns0:<http://exmo.inrialpes.fr/connectors-core/>
+//        PREFIX ns1:<http://xmlns.com/foaf/0.1/>
+//        SELECT DISTINCT ?s1 ?s2 
+//        WHERE {
+//        ?s1 rdf:type ns0:Personne .
+//        ?s2 rdf:type ns1:Person .
+//        ?s1 ns0:nom ?o1 .
+//        ?s2 ns1:givenName ?o2 .
+//        FILTER(?s1 != ?s2 && ?o2 = ?o1)
+//        }
+        String query = renderer.getQueryFromOnto1ToOnto2(cell);
+//        System.out.println("QueryFromSimpleLinkkeyFromIntersects : " + query);
+        Model values = Utils.loadValues(new String[]{"intersects_people_1.rdf", "intersects_people_2.rdf"});
+
+        Query selectQuery = QueryFactory.create(query);
+        QueryExecution selectQueryExec = QueryExecutionFactory.create(selectQuery, values);
+        ResultSet results = selectQueryExec.execSelect();
+        String[] expectedS1 = {
+            "http://exmo.inrialpes.fr/connectors-data/people#alice_c1_1",
+            "http://exmo.inrialpes.fr/connectors-data/people#alice_c2_1",};
+        String[] expectedS2 = {
+            "http://exmo.inrialpes.fr/connectors-data/people#alice_c1_2",
+            "http://exmo.inrialpes.fr/connectors-data/people#alice_c2_2",};
+        HashMap<String, Collection<String>> allResultValues = Utils.getResultValues(results);
+        Collection<String> resultValues = allResultValues.get("s1");
+        assertEquals(resultValues.size(), expectedS1.length);
+        for (String expected : expectedS1) {
+            assertTrue(resultValues.contains(expected));
+        }
+
+        resultValues = allResultValues.get("s2");
+        assertEquals(resultValues.size(), expectedS2.length);
+        for (String expected : expectedS2) {
+            assertTrue(resultValues.contains(expected));
+        }
+
+        // With remote services
+//        URI remoteURI1 = new URI("http://example.org/data.rdf");
+//        URI remoteURI2 = new URI("http://example.org/data.rdf");
+//        String expectedQuery = "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n"
+//                + "PREFIX ns0:<http://exmo.inrialpes.fr/connectors#>\n"
 //                + "PREFIX ns1:<http://purl.org/ontology/mo/>\n"
-//                //+ "CONSTRUCT { ?s1 owl:sameAs ?s2 }"
 //                + "SELECT ?s1 ?s2"
 //                + "WHERE {\n"
+//                + "SERVICE <http://example1.org/data.rdf> {"
 //                + "?s1 rdf:type ns0:RootElement .\n"
 //                + "?s1 ns0:number ?o1 ."
-//                + "SERVICE <http://example.org/data.rdf> {"
-//                + "?s2 rdf:type ns1:MusicalWork . \n"
-//                + "?s2 ns1:opus ?o1"
 //                + "}\n"
-//                + "}\n";
-//
-//        String expectedQuery2 = "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n"
-//                + "PREFIX ns0:<http://exmo.inria.fr/connectors#>\n"
-//                + "PREFIX ns1:<http://purl.org/ontology/mo/>\n"
-//                + "CONSTRUCT ?s1 ?s2"
-//                + "WHERE {\n"
+//                + "SERVICE <http://example2.org/data.rdf> {"
 //                + "?s2 rdf:type ns1:MusicalWork . \n"
 //                + "?s2 ns1:opus ?o1"
-//                + "SERVICE <http://example.org/data.rdf> {"
-//                + "?s1 rdf:type ns0:RootElement .\n"
-//                + "?s1 ns0:number ?o1 ."
 //                + "}\n"
 //                + "}\n";
-//        assertEquals(renderer.getQuery(cell, 0, remoteURI), expectedQuery1);
-//        assertEquals(renderer.getQuery(cell, 1, remoteURI), expectedQuery2);
-//    }
+//        
+//        assertEquals(renderer.getQuery(cell, remoteURI1, remoteURI2), expectedQuery);
+    }
 //
-//    @Test(groups = {"full", "impl", "raw"})
+//    @Test(groups = {"full", "impl", "raw"}, dependsOnMethods = {"QueryFromWithoutLinkkey", "QueryFromSimpleLinkkeyFromEquals"})
 //    public void HaveTodo() throws Exception {
 //        fail("HAVE TODO : with (in + eq) => OPTIONAL (with SERVICE call on remote) / many correspondances / With transformations / On local (FROM ...) or remote sparql endpoint (SERVICE) ");
 //    }
diff --git a/test/src/fr/inrialpes/exmo/align/test/Utils.java b/test/src/fr/inrialpes/exmo/align/test/Utils.java
index 36063e9add51d3e7be6c41f9d4f91c4da8ac3873..c8538002208307ba0dd3ec11565419128137aac2 100644
--- a/test/src/fr/inrialpes/exmo/align/test/Utils.java
+++ b/test/src/fr/inrialpes/exmo/align/test/Utils.java
@@ -1,30 +1,110 @@
 package fr.inrialpes.exmo.align.test;
 
+import com.hp.hpl.jena.ontology.OntModelSpec;
+import com.hp.hpl.jena.query.Dataset;
+import com.hp.hpl.jena.query.DatasetFactory;
+import com.hp.hpl.jena.query.QuerySolution;
+import com.hp.hpl.jena.query.ResultSet;
+import com.hp.hpl.jena.rdf.model.Model;
+import com.hp.hpl.jena.rdf.model.ModelFactory;
 import fr.inrialpes.exmo.align.impl.edoal.EDOALAlignment;
 import fr.inrialpes.exmo.align.parser.AlignmentParser;
 import fr.inrialpes.exmo.align.parser.RDFParser;
 import java.io.FileInputStream;
 import java.io.InputStream;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.TreeSet;
 
 /*
  * To change this license header, choose License Headers in Project Properties.
  * To change this template file, choose Tools | Templates
  * and open the template in the editor.
  */
-
 /**
  *
  * @author Nicolas Guillouet <nicolas@meaningengines.com>
  */
 public class Utils {
-    
+
     public static EDOALAlignment loadAlignement(String fileName) throws Exception {
         AlignmentParser aparser = new AlignmentParser(0);
-        assert(aparser != null);
+        assert (aparser != null);
         aparser.initAlignment(null);
         RDFParser alignmentParser = new RDFParser();
         InputStream alignIn = new FileInputStream("test/input/" + fileName);
         EDOALAlignment loadedAlignment = alignmentParser.parse(alignIn);
         return loadedAlignment;
     }
+
+    public static Model loadValues(String[] filesNames) throws Exception {
+//        Model model = ModelFactory.createOntologyModel(OntModelSpec.OWL_DL_MEM_RULE_INF, null);
+        Dataset dataset = DatasetFactory.createMem();
+        Model model = dataset.getDefaultModel();
+        for (String fileName : filesNames) {
+            String fullPathName = "test/input/" + fileName;
+            String source = "file:" + fullPathName;
+            InputStream descIn = new FileInputStream(fullPathName);
+            model.read(descIn, source);
+            descIn.close();
+        }
+        return model;
+    }
+
+    /**
+     * Return pair key => value with key = vars of resultSet value = uniq
+     * results of each var.
+     *
+     * @param resultSet
+     * @return
+     */
+    public static HashMap<String, Collection<String>> getResultValues(ResultSet resultSet) {
+        HashMap<String, Collection<String>> toReturn = new HashMap();
+        List<String> varsNames = resultSet.getResultVars();
+        for (String varName : varsNames) {
+            toReturn.put(varName, new TreeSet());
+        }
+        while (resultSet.hasNext()) {
+            QuerySolution querySolution = resultSet.nextSolution();
+//            System.out.println("in getResultValues s1 : " + querySolution.get("s1").toString() + " s2 : " + querySolution.get("s2").toString());
+            for (String varName : varsNames) {
+                if (querySolution != null) {
+                    if (querySolution.get(varName) != null) {
+                        toReturn.get(varName).add(querySolution.get(varName).toString());
+                    }
+                }
+            }
+        }
+        return toReturn;
+    }
+
+    public static void showResultValues(ResultSet resultSet) {
+        List<String> varsNames = resultSet.getResultVars();
+        StringBuilder stringBuilder = new StringBuilder();
+        String separator = " ################### ";
+        stringBuilder.append(separator);
+        for (String varName : varsNames) {
+            stringBuilder.append(varName);
+        }
+        stringBuilder.append(separator);
+        stringBuilder.append("\n");
+
+        while (resultSet.hasNext()) {
+            QuerySolution querySolution = resultSet.nextSolution();
+            if (querySolution != null) {
+                for (String varName : varsNames) {
+                    stringBuilder.append(separator);
+                    if (querySolution.get(varName) != null) {
+                        stringBuilder.append(querySolution.get(varName).toString());
+                    }
+                }
+            } else {
+                stringBuilder.append("NO SOLUTION");
+            }
+            stringBuilder.append("\n");
+        }
+        System.out.println(stringBuilder.toString());
+    }
+
 }