diff --git a/sparqlGraphLibrary/src/main/java/com/ge/research/semtk/sparqlToXLib/SparqlToXLibUtil.java b/sparqlGraphLibrary/src/main/java/com/ge/research/semtk/sparqlToXLib/SparqlToXLibUtil.java index 47db1732f..5b43feb7d 100644 --- a/sparqlGraphLibrary/src/main/java/com/ge/research/semtk/sparqlToXLib/SparqlToXLibUtil.java +++ b/sparqlGraphLibrary/src/main/java/com/ge/research/semtk/sparqlToXLib/SparqlToXLibUtil.java @@ -556,18 +556,32 @@ public static String generateConstructConnected(SparqlConnection conn, OntologyI * @throws Exception */ public static String generateGetCardinalityRestrictions(SparqlConnection conn, OntologyInfo oInfo) throws Exception { - StringBuffer sparql = new StringBuffer(); - sparql.append("SELECT DISTINCT ?class ?property ?restriction ?limit \n"); - sparql.append(generateSparqlFromOrUsing("", "FROM", conn, oInfo) + "\n"); - sparql.append("WHERE { \n"); - sparql.append(" ?r a . \n"); - sparql.append(" ?r ?property. \n"); - // note: very weird that the class is subClassOf the restriction -Paul - sparql.append(" OPTIONAL { ?class ?r. } \n"); - sparql.append(" ?r ?restriction ?limit. \n"); - sparql.append(" FILTER REGEX (str(?restriction), \"ardinality\" ). \n"); - sparql.append("} ORDER BY ?class ?property ?restriction \n"); - return sparql.toString(); + String ret = "PREFIX rdf: \n" + + "PREFIX owl: \n" + + " \n" + + "SELECT DISTINCT ?class ?property ?restriction ?limit \n" + + " \n" + + generateSparqlFromOrUsing("", "FROM", conn, oInfo) + "\n" + + " \n" + + "WHERE { \n" + + " ?r a . \n" + + " ?r ?property. \n" + + " OPTIONAL { \n" + + " { \n" + + " ?class ?r. \n" + + genBlankNodeFilterStatement("?class", false) + "\n" + + " } union { \n" + + " ?un ?r . \n" + + " ?un owl:unionOf ?list . \n" + + " ?list rdf:rest* ?item . \n" + + " ?item rdf:first ?class. \n" + + " } \n" + + " } \n" + + " ?r ?restriction ?limit. \n" + + " FILTER REGEX (str(?restriction), \"ardinality\" ). \n" + + "} ORDER BY ?class ?property ?restriction \n" + ; + return ret; } /** @@ -577,14 +591,14 @@ public static String generateGetCardinalityRestrictions(SparqlConnection conn, O * @param domain * @return */ - public static String generateGetDatatypeRestriction(String graphName, String domain){ + public static String generateGetDatatypeRestriction(String graphName, String domain, SparqlConnection conn, OntologyInfo oInfo) throws Exception { // SADL makes datatypes either owl:onDatatype or a union of objects w/o the onDatatype predicate (curious) String retval = "PREFIX rdf: \n" + "PREFIX rdfs: \n" + "PREFIX owl: \n" + "SELECT DISTINCT ?dataType ?equivType ?r_pred ?r_obj \n" + - " FROM \n" + + generateSparqlFromOrUsing("", "FROM", conn, oInfo) + "\n" + "WHERE { \n" + " ?dataType rdf:type rdfs:Datatype . \n" + genDomainFilterStatement("dataType", domain, "") + "\n" + diff --git a/sparqlGraphLibrary/src/test/java/com/ge/research/semtk/ontologyTools/test/RestrictionCheckerTest_IT.java b/sparqlGraphLibrary/src/test/java/com/ge/research/semtk/ontologyTools/test/RestrictionCheckerTest_IT.java index ace2b574e..d588367d6 100644 --- a/sparqlGraphLibrary/src/test/java/com/ge/research/semtk/ontologyTools/test/RestrictionCheckerTest_IT.java +++ b/sparqlGraphLibrary/src/test/java/com/ge/research/semtk/ontologyTools/test/RestrictionCheckerTest_IT.java @@ -99,4 +99,35 @@ public void testOverrideStricter() throws Exception { IntegrationTestUtility.compareResults(violationsTable.toCSVString(), this, "cardinality_testStricter_results_concise.csv"); // csv file contains expected violations in concise format } + @Test + public void testWithSadlDescribesUnion() throws Exception { + // testing this type of SADL: + // myProp describes { This or That } with a single value of type string. + + // setup + TestGraph.clearGraph(); + TestGraph.uploadOwlResource(this, "CardinalityDescUnion.owl"); + SparqlConnection conn = TestGraph.getSparqlConn(); + OntologyInfo oInfo = new OntologyInfo(conn); + RestrictionChecker checker = new RestrictionChecker(conn, oInfo); + + // check both restrictions + assertTrue(checker.hasCardinalityRestriction("http://CardinalityDescUnion#Class1", "http://CardinalityDescUnion#uProp")); + assertTrue(checker.hasCardinalityRestriction("http://CardinalityDescUnion#Class1", "http://CardinalityDescUnion#uProp")); + + // check restrictions are exactly 1 + assertTrue("1 did not satisfy 'exactly 1' cardinality", checker.satisfiesCardinality("http://CardinalityDescUnion#Class1", "http://CardinalityDescUnion#uProp", 1)); + assertFalse("2 did satisfied 'exactly 1' cardinality", checker.satisfiesCardinality("http://CardinalityDescUnion#Class1", "http://CardinalityDescUnion#uProp", 2)); + assertFalse("0 did satisfied 'exactly 1' cardinality", checker.satisfiesCardinality("http://CardinalityDescUnion#Class1", "http://CardinalityDescUnion#uProp", 0)); + assertTrue("1 did not satisfy 'exactly 1' cardinality", checker.satisfiesCardinality("http://CardinalityDescUnion#Class2", "http://CardinalityDescUnion#uProp", 1)); + assertFalse("2 did satisfied 'exactly 1' cardinality", checker.satisfiesCardinality("http://CardinalityDescUnion#Class2", "http://CardinalityDescUnion#uProp", 2)); + assertFalse("0 did satisfied 'exactly 1' cardinality", checker.satisfiesCardinality("http://CardinalityDescUnion#Class2", "http://CardinalityDescUnion#uProp", 0)); + + // find one violation on Class2 + Table violationsTable = checker.getCardinalityViolations(false); + assertEquals(violationsTable.getNumRows(), 1); + assertTrue(violationsTable.getCell(0, 0).endsWith("#Class2")); + + } + } diff --git a/sparqlGraphLibrary/src/test/resources/CardinalityDescUnion.owl b/sparqlGraphLibrary/src/test/resources/CardinalityDescUnion.owl new file mode 100644 index 000000000..c0eeab76b --- /dev/null +++ b/sparqlGraphLibrary/src/test/resources/CardinalityDescUnion.owl @@ -0,0 +1,45 @@ + + + + + + This ontology was created from a SADL file 'CardinalityDescUnion.sadl' and should not be directly edited. + + + + + + + + + + + 1 + + + + + + + + + + + + first 1a + + + second 2a + first 2a + + diff --git a/sparqlGraphLibrary/src/test/resources/CardinalityDescUnion.sadl b/sparqlGraphLibrary/src/test/resources/CardinalityDescUnion.sadl new file mode 100644 index 000000000..aa4002997 --- /dev/null +++ b/sparqlGraphLibrary/src/test/resources/CardinalityDescUnion.sadl @@ -0,0 +1,13 @@ +uri "http://CardinalityDescUnion". + +Class1 is a class. +Class2 is a class. + +uProp describes { Class1 or Class2 } with a single value of type string. + +Instance1a is a Class1, + with uProp "first 1a". + +Instance2a is a Class2, + with uProp "first 2a" , + with uProp "second 2a". \ No newline at end of file