/** * Checks whether sub is equivalent to sup * * @param sub * @param sup * @return */ public static boolean isEquivalentTo(final Query q1, final Query q2) { return isSubsumedBy(q1, q2) && isSubsumedBy(q2, q1); }
/** * Checks whether sub is equivalent to sup * * @param sub * @param sup * @return */ public static boolean isEquivalentTo(final Query q1, final Query q2) { return isSubsumedBy(q1, q2) && isSubsumedBy(q2, q1); }
/** * Checks whether sub is equivalent to sup * * @param sub * @param sup * @return */ public static boolean isEquivalentTo(final Query q1, final Query q2) { return isSubsumedBy(q1, q2) && isSubsumedBy(q2, q1); }
/** * Simple query subsumption similar to standard concept subsumption. Every Male is a Person so query 1 is subsumed by query 2. The converse is obviously not * true. */ public void example1() { final Query q1 = query("?x a family:Male ."); final Query q2 = query("?x a family:Person ."); System.out.println("Example 1"); System.out.println("========="); System.out.println("Query 1: " + q1.toString()); System.out.println("Query 2: " + q2.toString()); System.out.println(); System.out.println("Query 1 is subsumed by query 2: " + QuerySubsumption.isSubsumedBy(q1, q2)); System.out.println("Query 2 is subsumed by query 1: " + QuerySubsumption.isSubsumedBy(q2, q1)); System.out.println(); }
/** * Another example of subsumption. First query asks for all people married to Male individuals which is subsumed by the second query which asks for all * Females. */ public void example2() { final Query q3 = query("?x family:isMarriedTo ?y . ?y rdf:type family:Male"); final Query q4 = query("?x a family:Female ."); System.out.println("Example 2"); System.out.println("========="); System.out.println("Query 3: " + q3.toString()); System.out.println("Query 4: " + q4.toString()); System.out.println(); System.out.println("Query 3 is subsumed by query 4: " + QuerySubsumption.isSubsumedBy(q3, q4)); System.out.println("Query 4 is subsumed by query 3: " + QuerySubsumption.isSubsumedBy(q4, q3)); System.out.println(); }
/** * Simple query subsumption similar to standard concept subsumption. Every Male is a Person so query 1 is subsumed by query 2. The converse is obviously not * true. */ public void example1() { final Query q1 = query("?x a family:Male ."); final Query q2 = query("?x a family:Person ."); System.out.println("Example 1"); System.out.println("========="); System.out.println("Query 1: " + q1.toString()); System.out.println("Query 2: " + q2.toString()); System.out.println(); System.out.println("Query 1 is subsumed by query 2: " + QuerySubsumption.isSubsumedBy(q1, q2)); System.out.println("Query 2 is subsumed by query 1: " + QuerySubsumption.isSubsumedBy(q2, q1)); System.out.println(); }
/** * Another example of subsumption. First query asks for all people married to Male individuals which is subsumed by the second query which asks for all * Females. */ public void example2() { final Query q3 = query("?x family:isMarriedTo ?y . ?y rdf:type family:Male"); final Query q4 = query("?x a family:Female ."); System.out.println("Example 2"); System.out.println("========="); System.out.println("Query 3: " + q3.toString()); System.out.println("Query 4: " + q4.toString()); System.out.println(); System.out.println("Query 3 is subsumed by query 4: " + QuerySubsumption.isSubsumedBy(q3, q4)); System.out.println("Query 4 is subsumed by query 3: " + QuerySubsumption.isSubsumedBy(q4, q3)); System.out.println(); }
/** * Example showing query equivalence. The subproperty relation between hasFather and hasParent properties would normally establish subsumption in one way * but due to cardinality restrictions defined in the ontology two queries _end up being equivalent, */ public void example3() { final Query q5 = query("?x family:hasFather ?y . "); final Query q6 = query("?x family:hasParent ?y . ?y a family:Male ."); System.out.println("Example 3"); System.out.println("========="); System.out.println("Query 5: " + q5.toString()); System.out.println("Query 6: " + q6.toString()); System.out.println(); System.out.println("Query 5 is subsumed by query 6: " + QuerySubsumption.isSubsumedBy(q5, q6)); System.out.println("Query 6 is subsumed by query 5: " + QuerySubsumption.isSubsumedBy(q5, q6)); System.out.println("Query 5 is equivalent to query 6: " + QuerySubsumption.isEquivalentTo(q5, q6)); System.out.println(); }
/** * Example showing query equivalence. The subproperty relation between hasFather and hasParent properties would normally establish subsumption in one way * but due to cardinality restrictions defined in the ontology two queries _end up being equivalent, */ public void example3() { final Query q5 = query("?x family:hasFather ?y . "); final Query q6 = query("?x family:hasParent ?y . ?y a family:Male ."); System.out.println("Example 3"); System.out.println("========="); System.out.println("Query 5: " + q5.toString()); System.out.println("Query 6: " + q6.toString()); System.out.println(); System.out.println("Query 5 is subsumed by query 6: " + QuerySubsumption.isSubsumedBy(q5, q6)); System.out.println("Query 6 is subsumed by query 5: " + QuerySubsumption.isSubsumedBy(q5, q6)); System.out.println("Query 5 is equivalent to query 6: " + QuerySubsumption.isEquivalentTo(q5, q6)); System.out.println(); }
/** * The subsumption in this example holds because of the subproperty relation between hasBrother and hasSibling. however, The second query uses the variable * name ?z instead of the the variable name ?y used in the first query. The query subsumption algorithm finds the mapping between query variables. */ public void example4() { final Query q7 = query("?x a family:Female; family:hasBrother ?y . "); final Query q8 = query("?x a family:Female; family:hasSibling ?z ."); System.out.println("Example 4"); System.out.println("========="); System.out.println("Query 7: " + q7.toString()); System.out.println("Query 8: " + q8.toString()); System.out.println(); System.out.println("Query 7 is subsumed by query 8: " + QuerySubsumption.isSubsumedBy(q7, q8)); System.out.print("Subsumption mappings: "); final QueryResult mappings = QuerySubsumption.getSubsumptionMappings(q7, q8); for (final ResultBinding mapping : mappings) for (final Iterator<?> j = q8.getVars().iterator(); j.hasNext();) { final ATermAppl var = (ATermAppl) j.next(); System.out.print(var.getArgument(0) + " -> " + mapping.getValue(var)); //I get var(x) as opposed to x if (j.hasNext()) System.out.print(", "); } System.out.println(); } }
/** * The subsumption in this example holds because of the subproperty relation between hasBrother and hasSibling. however, The second query uses the variable * name ?z instead of the the variable name ?y used in the first query. The query subsumption algorithm finds the mapping between query variables. */ public void example4() { final Query q7 = query("?x a family:Female; family:hasBrother ?y . "); final Query q8 = query("?x a family:Female; family:hasSibling ?z ."); System.out.println("Example 4"); System.out.println("========="); System.out.println("Query 7: " + q7.toString()); System.out.println("Query 8: " + q8.toString()); System.out.println(); System.out.println("Query 7 is subsumed by query 8: " + QuerySubsumption.isSubsumedBy(q7, q8)); System.out.print("Subsumption mappings: "); final QueryResult mappings = QuerySubsumption.getSubsumptionMappings(q7, q8); for (final ResultBinding mapping : mappings) for (final Iterator<?> j = q8.getVars().iterator(); j.hasNext();) { final ATermAppl var = (ATermAppl) j.next(); System.out.print(var.getArgument(0) + " -> " + mapping.getValue(var)); //I get var(x) as opposed to x if (j.hasNext()) System.out.print(", "); } System.out.println(); } }
@Test public void testIsSubsumedBy() { Query[] queries = new Query[2]; queries = example1(); assertTrue(QuerySubsumption.isSubsumedBy(queries[0], queries[1])); assertFalse(QuerySubsumption.isSubsumedBy(queries[1], queries[0])); queries = example2(); assertTrue(QuerySubsumption.isSubsumedBy(queries[0], queries[1])); assertFalse(QuerySubsumption.isSubsumedBy(queries[1], queries[0])); queries = example3(); assertTrue(QuerySubsumption.isSubsumedBy(queries[0], queries[1])); assertTrue(QuerySubsumption.isSubsumedBy(queries[1], queries[0])); queries = example4(); assertTrue(QuerySubsumption.isSubsumedBy(queries[0], queries[1])); assertFalse(QuerySubsumption.isSubsumedBy(queries[1], queries[0])); }