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()); + } + }