Manybubbles has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/202775

Change subject: Handle expanded values
......................................................................

Handle expanded values

Change-Id: I5fb72c256d2f3f3c8e2478c84026bb657ad49e0f
---
M common/src/main/java/org/wikidata/query/rdf/common/uri/Ontology.java
M tools/src/main/java/org/wikidata/query/rdf/tool/rdf/Munger.java
M tools/src/main/java/org/wikidata/query/rdf/tool/rdf/RdfRepository.java
M tools/src/test/java/org/wikidata/query/rdf/tool/MungeIntegrationTest.java
M tools/src/test/java/org/wikidata/query/rdf/tool/rdf/MungerUnitTest.java
M 
tools/src/test/java/org/wikidata/query/rdf/tool/rdf/RdfRepositoryIntegrationTest.java
6 files changed, 303 insertions(+), 9 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/wikidata/query/rdf 
refs/changes/75/202775/1

diff --git 
a/common/src/main/java/org/wikidata/query/rdf/common/uri/Ontology.java 
b/common/src/main/java/org/wikidata/query/rdf/common/uri/Ontology.java
index c8b0d4e..590706a 100644
--- a/common/src/main/java/org/wikidata/query/rdf/common/uri/Ontology.java
+++ b/common/src/main/java/org/wikidata/query/rdf/common/uri/Ontology.java
@@ -18,11 +18,12 @@
     public static final String STATEMENT = NAMESPACE + "Statement";
     /**
      * Wikibase exports references with an assertion that their RDF.TYPE is 
this
-     * and we fitler that out.
+     * and we filter that out.
      */
     public static final String REFERENCE = NAMESPACE + "Reference";
     /**
-     * Wikibase exports values with an assertion that their RDF.TYPE is this.
+     * Wikibase exports values with an assertion that their RDF.TYPE is this 
and
+     * we filter that out.
      */
     public static final String VALUE = NAMESPACE + "Value";
 
@@ -43,6 +44,37 @@
     public static final String NORMAL_RANK = NAMESPACE + "NormalRank";
     public static final String DEPRECATED_RANK = NAMESPACE + "DeprecatedRank";
 
+    public static class Time {
+        private static final String PREFIX = NAMESPACE + "time";
+        /**
+         * The actual value of the time. We will always load this value exactly
+         * as wikibase exports it - never normalize it for precision, timezone,
+         * or calendar model.
+         */
+        public static final String VALUE = PREFIX + "Time";
+        /**
+         * The precision of the time. Wikibase exports integers with specific
+         * meanings: 0 - billion years, 1 - hundred million years, ..., 6 -
+         * millennium, 7 - century, 8 - decade, 9 - year, 10 - month, 11 - day,
+         * 12 - hour, 13 - minute, 14 - second.
+         */
+        public static final String PRECISION = PREFIX + "Precision";
+        /**
+         * Timezone in which the time was originally defined. A signed integer
+         * representing offset from UTC in minutes.
+         */
+        public static final String TIMEZONE = PREFIX + "Timezone";
+        // TODO we should check if we have to normalize the simple values to 
UTC
+        // or if wikibase does that
+        /**
+         * Calendar model in which the date was defined.
+         */
+        public static final String CALENDAR_MODEL = PREFIX + "CalendarModel";
+        // TODO normalize simple values in different calendar models into
+        // Gregorian where possible
+
+    }
+
     public static StringBuilder prefix(StringBuilder query) {
         return query.append("PREFIX ontology: 
<").append(NAMESPACE).append(">\n");
     }
diff --git a/tools/src/main/java/org/wikidata/query/rdf/tool/rdf/Munger.java 
b/tools/src/main/java/org/wikidata/query/rdf/tool/rdf/Munger.java
index f941f88..1005113 100644
--- a/tools/src/main/java/org/wikidata/query/rdf/tool/rdf/Munger.java
+++ b/tools/src/main/java/org/wikidata/query/rdf/tool/rdf/Munger.java
@@ -210,19 +210,32 @@
         private boolean statement() throws ContainedException {
             subject = statement.getSubject().stringValue();
             predicate = statement.getPredicate().stringValue();
-            if (subject.startsWith(entityDataUris.namespace())) {
+            if (inNamespace(subject, entityDataUris.namespace())) {
                 return entityDataStatement();
             }
-            if (subject.startsWith(entityUris.statement().namespace())) {
+            if (inNamespace(subject, entityUris.statement().namespace())) {
                 return entityStatementStatement();
             }
-            if (subject.startsWith(entityUris.reference().namespace())) {
+            if (inNamespace(subject, entityUris.reference().namespace())) {
                 return entityReferenceStatement();
             }
-            if (subject.startsWith(entityUris.namespace())) {
+            if (inNamespace(subject, entityUris.value().namespace())) {
+                return entityValueStatement();
+            }
+            if (inNamespace(subject, entityUris.namespace())) {
                 return entityStatement();
             }
             return unknownStatement();
+        }
+
+        /**
+         * Is a uri in just this namespace? The trouble is that some namespaces
+         * are suffixes of one another. For now / isn't a valid character after
+         * a namespace so we can use its absence to determine that we're just 
in
+         * the provided namespace and not a suffix namespace.
+         */
+        private boolean inNamespace(String uri, String namespace) {
+            return uri.startsWith(namespace) && uri.indexOf('/', 
namespace.length()) < 0;
         }
 
         /**
@@ -323,6 +336,11 @@
                 unknownSubjects.put(subject, statement);
                 return false;
             }
+            String object = statement.getObject().stringValue();
+            if (inNamespace(predicate, entityUris.value().namespace())
+                    && inNamespace(object, entityUris.value().namespace())) {
+                registerExtraValidSubject(object);
+            }
             return true;
         }
 
@@ -354,6 +372,42 @@
                 unknownSubjects.put(subject, statement);
                 return false;
             }
+            String object = statement.getObject().stringValue();
+            if (inNamespace(predicate, entityUris.value().namespace())
+                    && inNamespace(object, entityUris.value().namespace())) {
+                registerExtraValidSubject(object);
+            }
+            return true;
+        }
+
+        /**
+         * Process a statement who's subject is in the entity value prefix.
+         *
+         * @return true to keep the statement, false to remove it
+         */
+        private boolean entityValueStatement() throws ContainedException {
+            switch (predicate) {
+            case RDF.TYPE:
+                /*
+                 * We don't need v:<uuid> a ontology:Value because its super
+                 * common and not super interesting.
+                 */
+                if 
(statement.getObject().stringValue().equals(Ontology.VALUE)) {
+                    return false;
+                }
+                break;
+            default:
+            }
+            if (!extraValidSubjects.contains(subject)) {
+                /*
+                 * Remove any statements about values that we don't yet know 
are
+                 * actually linked to the entity. We keep a backup of them in
+                 * unknownSubjects so we can restore them if they are later
+                 * linked.
+                 */
+                unknownSubjects.put(subject, statement);
+                return false;
+            }
             return true;
         }
 
@@ -367,6 +421,9 @@
             if (siteLinks.contains(subject)) {
                 return !removeSiteLinks;
             }
+            if (extraValidSubjects.contains(subject)) {
+                return true;
+            }
             if (predicate.equals(RDF.TYPE) && 
statement.getObject().stringValue().equals(SchemaDotOrg.ARTICLE)) {
                 siteLinks.add(subject);
                 /*
diff --git 
a/tools/src/main/java/org/wikidata/query/rdf/tool/rdf/RdfRepository.java 
b/tools/src/main/java/org/wikidata/query/rdf/tool/rdf/RdfRepository.java
index aabbc60..6a08180 100644
--- a/tools/src/main/java/org/wikidata/query/rdf/tool/rdf/RdfRepository.java
+++ b/tools/src/main/java/org/wikidata/query/rdf/tool/rdf/RdfRepository.java
@@ -67,7 +67,7 @@
      * next entity's managed tree starts. For example Q23 from wikidata 
includes
      * all statements about George Washington but not those about Martha
      * (Q191789) even though she is linked by the spouse attribute. On the 
other
-     * hand the qualifiers on statements about George are included in George
+     * hand the qualifiers on statements about George are included in George.
      *
      * @param entityId id of the entity to sync
      * @param statements all known statements about the entity
@@ -85,6 +85,24 @@
             siteLinksBuilder.where().notExists().values(statements, "?s", 
"?p", "?o");
         }
 
+        UpdateBuilder valuesOnReferencesBuilder = updateBuilder();
+        valuesOnReferencesBuilder.prefix("prov", Provenance.NAMESPACE);
+        valuesOnReferencesBuilder.delete("?s", "?p", "?o");
+        valuesOnReferencesBuilder.where(entity, "?statementPred", 
"?statement");
+        valuesOnReferencesBuilder.where().add(startsWith("?statement", 
entityUris.statement().namespace()));
+        valuesOnReferencesBuilder.where("?statement", "prov:wasDerivedFrom", 
"?ref");
+        valuesOnReferencesBuilder.where("?ref", "?expandedValuePred", "?s");
+        valuesOnReferencesBuilder.where().add(startsWith("?expandedValuePred", 
entityUris.value().namespace()));
+        valuesOnReferencesBuilder.where("?s", "?p", "?o");
+        // We can't clear references that are still used elsewhere
+        valuesOnReferencesBuilder.where().notExists()//
+                .add("?otherStatement", "prov:wasDerivedFrom", "?ref")//
+                .add("?otherEntity", "?otherStatementPred", 
"?otherStatement")//
+                .add("FILTER ( " + entity + " != ?otherEntity ) .");
+        if (!statements.isEmpty()) {
+            valuesOnReferencesBuilder.where().notExists().values(statements, 
"?s", "?p", "?o");
+        }
+
         UpdateBuilder referencesBuilder = updateBuilder();
         referencesBuilder.prefix("prov", Provenance.NAMESPACE);
         referencesBuilder.delete("?s", "?p", "?o");
@@ -99,6 +117,17 @@
                 .add("FILTER ( " + entity + " != ?otherEntity ) .");
         if (!statements.isEmpty()) {
             referencesBuilder.where().notExists().values(statements, "?s", 
"?p", "?o");
+        }
+
+        UpdateBuilder valuesOnExpandedStatementsBuilder = updateBuilder();
+        valuesOnExpandedStatementsBuilder.delete("?s", "?p", "?o");
+        valuesOnExpandedStatementsBuilder.where(entity, "?statementPred", 
"?statement");
+        valuesOnExpandedStatementsBuilder.where().add(startsWith("?statement", 
entityUris.statement().namespace()));
+        valuesOnExpandedStatementsBuilder.where("?statement", 
"?expandedValuePred", "?s");
+        
valuesOnExpandedStatementsBuilder.where().add(startsWith("?expandedValuePred", 
entityUris.value().namespace()));
+        valuesOnExpandedStatementsBuilder.where("?s", "?p", "?o");
+        if (!statements.isEmpty()) {
+            
valuesOnExpandedStatementsBuilder.where().notExists().values(statements, "?s", 
"?p", "?o");
         }
 
         UpdateBuilder expandedStatementsBuilder = updateBuilder();
@@ -126,7 +155,9 @@
          */
         StringBuilder command = new StringBuilder();
         command.append(siteLinksBuilder).append(";\n");
+        command.append(valuesOnReferencesBuilder).append(";\n");
         command.append(referencesBuilder).append(";\n");
+        command.append(valuesOnExpandedStatementsBuilder).append(";\n");
         command.append(expandedStatementsBuilder).append(";\n");
         command.append(generalBuilder).append(";\n");
 
diff --git 
a/tools/src/test/java/org/wikidata/query/rdf/tool/MungeIntegrationTest.java 
b/tools/src/test/java/org/wikidata/query/rdf/tool/MungeIntegrationTest.java
index 3ba2976..688a57f 100644
--- a/tools/src/test/java/org/wikidata/query/rdf/tool/MungeIntegrationTest.java
+++ b/tools/src/test/java/org/wikidata/query/rdf/tool/MungeIntegrationTest.java
@@ -30,7 +30,7 @@
                 new Munger(entityDataUris, entityUris).singleLabelMode("en"), 
source);
         http.start();
         try {
-            assertEquals(907, rdfRepository.loadUrl("http://localhost:10999";));
+            assertEquals(1002, 
rdfRepository.loadUrl("http://localhost:10999";));
         } finally {
             http.stop();
         }
diff --git 
a/tools/src/test/java/org/wikidata/query/rdf/tool/rdf/MungerUnitTest.java 
b/tools/src/test/java/org/wikidata/query/rdf/tool/rdf/MungerUnitTest.java
index 40d0a35..d511537 100644
--- a/tools/src/test/java/org/wikidata/query/rdf/tool/rdf/MungerUnitTest.java
+++ b/tools/src/test/java/org/wikidata/query/rdf/tool/rdf/MungerUnitTest.java
@@ -7,6 +7,7 @@
 import static org.wikidata.query.rdf.tool.StatementHelper.siteLink;
 import static org.wikidata.query.rdf.tool.StatementHelper.statement;
 
+import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -16,6 +17,7 @@
 import org.junit.runner.RunWith;
 import org.openrdf.model.Literal;
 import org.openrdf.model.Statement;
+import org.openrdf.model.impl.IntegerLiteralImpl;
 import org.openrdf.model.impl.LiteralImpl;
 import org.openrdf.model.vocabulary.XMLSchema;
 import org.wikidata.query.rdf.common.uri.Entity;
@@ -186,9 +188,88 @@
         assertThat(george, hasItem(qualifierDecl));
     }
 
-    // TODO expanded values
+    @Test
+    public void basicExpandedValue() {
+        List<Statement> universe = basicEntity("Q1");
+        String statementUri = entityUris.statement().namespace() + 
"q1-someuuid";
+        String valueUri = entityUris.value().namespace() + "someotheruuid";
+        Statement statementDecl = statement(universe, "Q1", "P580", 
statementUri);
+        Statement statementTypeDecl = statement(universe, statementUri, 
RDF.TYPE, Ontology.STATEMENT);
+        Statement valueDecl = statement(universe, statementUri, 
entityUris.value().namespace() + "P580",
+                new LiteralImpl("-13798000000-01-01T00:00:00Z", 
XMLSchema.DATETIME));
+        Statement expandedValueDecl = statement(universe, statementUri, 
entityUris.value().namespace() + "P580"
+                + "-value", valueUri);
+        Statement expandedValueTypeDecl = statement(universe, valueUri, 
RDF.TYPE, Ontology.VALUE);
+        /*
+         * Currently wikibase exports the deep time values as strings, not
+         * dateTime.
+         */
+        Statement expandedValueValueDecl = statement(universe, valueUri, 
Ontology.Time.VALUE,
+                "-13798000000-01-01T00:00:00Z");
+        Statement expandedValuePrecisionDecl = statement(universe, valueUri, 
Ontology.Time.PRECISION,
+                new IntegerLiteralImpl(BigInteger.valueOf(3)));
+        Statement expandedValueTimezoneDecl = statement(universe, valueUri, 
Ontology.Time.TIMEZONE,
+                new IntegerLiteralImpl(BigInteger.valueOf(0)));
+        Statement expandedValueCalendarModelDecl = statement(universe, 
valueUri, Ontology.Time.CALENDAR_MODEL,
+                "Q1985727");
+        munger.munge("Q1", universe);
+        assertThat(universe, hasItem(statementDecl));
+        assertThat(universe, not(hasItem(statementTypeDecl)));
+        assertThat(universe, hasItem(valueDecl));
+        assertThat(universe, hasItem(expandedValueDecl));
+        assertThat(universe, not(hasItem(expandedValueTypeDecl)));
+        assertThat(universe, hasItem(expandedValueDecl));
+        assertThat(universe, hasItem(expandedValueValueDecl));
+        assertThat(universe, hasItem(expandedValuePrecisionDecl));
+        assertThat(universe, hasItem(expandedValueTimezoneDecl));
+        assertThat(universe, hasItem(expandedValueCalendarModelDecl));
+    }
 
     @Test
+    public void basicExpandedValueOnReference() {
+        List<Statement> universe = basicEntity("Q1");
+        String statementUri = entityUris.statement().namespace() + 
"q1-someuuid";
+        String valueUri = entityUris.value().namespace() + "someotheruuid";
+        String referenceUri = entityUris.reference().namespace() + 
"yetanotheruuid";
+        Statement statementDecl = statement(universe, "Q1", "P580", 
statementUri);
+        Statement statementTypeDecl = statement(universe, statementUri, 
RDF.TYPE, Ontology.STATEMENT);
+        Statement valueDecl = statement(universe, statementUri, 
entityUris.value().namespace() + "P580",
+                new LiteralImpl("-13798000000-01-01T00:00:00Z", 
XMLSchema.DATETIME));
+        Statement referenceDecl = statement(universe, statementUri, 
Provenance.WAS_DERIVED_FROM, referenceUri);
+        Statement referenceTypeDecl = statement(universe, referenceUri, 
RDF.TYPE, Ontology.REFERENCE);
+        Statement expandedValueDecl = statement(universe, referenceUri, 
entityUris.value().namespace() + "P580"
+                + "-value", valueUri);
+        Statement expandedValueTypeDecl = statement(universe, valueUri, 
RDF.TYPE, Ontology.VALUE);
+        /*
+         * Currently wikibase exports the deep time values as strings, not
+         * dateTime.
+         */
+        Statement expandedValueValueDecl = statement(universe, valueUri, 
Ontology.Time.VALUE,
+                "-13798000000-01-01T00:00:00Z");
+        Statement expandedValuePrecisionDecl = statement(universe, valueUri, 
Ontology.Time.PRECISION,
+                new IntegerLiteralImpl(BigInteger.valueOf(3)));
+        Statement expandedValueTimezoneDecl = statement(universe, valueUri, 
Ontology.Time.TIMEZONE,
+                new IntegerLiteralImpl(BigInteger.valueOf(0)));
+        Statement expandedValueCalendarModelDecl = statement(universe, 
valueUri, Ontology.Time.CALENDAR_MODEL,
+                "Q1985727");
+        munger.munge("Q1", universe);
+        assertThat(universe, hasItem(statementDecl));
+        assertThat(universe, not(hasItem(statementTypeDecl)));
+        assertThat(universe, hasItem(valueDecl));
+        assertThat(universe, hasItem(referenceDecl));
+        assertThat(universe, not(hasItem(referenceTypeDecl)));
+        assertThat(universe, hasItem(expandedValueDecl));
+        assertThat(universe, not(hasItem(expandedValueTypeDecl)));
+        assertThat(universe, hasItem(expandedValueDecl));
+        assertThat(universe, hasItem(expandedValueValueDecl));
+        assertThat(universe, hasItem(expandedValuePrecisionDecl));
+        assertThat(universe, hasItem(expandedValueTimezoneDecl));
+        assertThat(universe, hasItem(expandedValueCalendarModelDecl));
+    }
+    // TODO somevalue and novalue
+
+    // TODO badges
+    @Test
     public void limitLanguagesLabel() throws ContainedException {
         limitLanguagesTestCase(RDFS.LABEL);
     }
diff --git 
a/tools/src/test/java/org/wikidata/query/rdf/tool/rdf/RdfRepositoryIntegrationTest.java
 
b/tools/src/test/java/org/wikidata/query/rdf/tool/rdf/RdfRepositoryIntegrationTest.java
index 5206d87..bfb9204 100644
--- 
a/tools/src/test/java/org/wikidata/query/rdf/tool/rdf/RdfRepositoryIntegrationTest.java
+++ 
b/tools/src/test/java/org/wikidata/query/rdf/tool/rdf/RdfRepositoryIntegrationTest.java
@@ -192,6 +192,99 @@
     }
 
     @Test
+    public void expandedStatementWithExpandedValue() throws 
QueryEvaluationException {
+        String statementUri = entityUris.statement().namespace() + 
"someotheruuid";
+        String valueUri = entityUris.value().namespace() + "someuuid";
+        List<Statement> george = new ArrayList<>();
+        statement(george, "Q23", "P509", statementUri);
+        statement(george, statementUri, entityUris.value().namespace() + 
"P509-value", valueUri);
+        statement(george, valueUri, Ontology.Time.VALUE, new 
LiteralImpl("cat"));
+        statement(george, valueUri, Ontology.Time.CALENDAR_MODEL, new 
LiteralImpl("animals"));
+        rdfRepository.sync("Q23", george);
+        assertTrue(rdfRepository
+                .ask(Ontology.prefix(entityUris.prefixes(new StringBuilder()))
+                .append("ASK { entity:Q23 entity:P509 [ v:P509-value [ 
ontology:timeTime \"cat\" ] ] }")
+                        .toString()));
+        assertTrue(rdfRepository.ask(Ontology.prefix(entityUris.prefixes(new 
StringBuilder()))
+                .append("ASK { entity:Q23 entity:P509 [ v:P509-value [ 
ontology:timeCalendarModel \"animals\" ] ] }")
+                .toString()));
+    }
+
+    @Test
+    public void expandedStatementWithExpandedValueChanged() throws 
QueryEvaluationException {
+        expandedStatementWithExpandedValue();
+        String statementUri = entityUris.statement().namespace() + 
"someotheruuid";
+        String valueUri = entityUris.value().namespace() + "someuuid";
+        List<Statement> george = new ArrayList<>();
+        statement(george, "Q23", "P509", statementUri);
+        statement(george, statementUri, entityUris.value().namespace() + 
"P509-value", valueUri);
+        statement(george, valueUri, Ontology.Time.VALUE, new 
LiteralImpl("dog"));
+        statement(george, valueUri, Ontology.Time.CALENDAR_MODEL, new 
LiteralImpl("animals"));
+        rdfRepository.sync("Q23", george);
+        assertTrue(rdfRepository.ask(Ontology.prefix(entityUris.prefixes(new 
StringBuilder()))
+                .append("ASK { entity:Q23 entity:P509 [ v:P509-value [ 
ontology:timeTime \"dog\" ] ] }").toString()));
+        assertTrue(rdfRepository.ask(Ontology.prefix(entityUris.prefixes(new 
StringBuilder()))
+                .append("ASK { entity:Q23 entity:P509 [ v:P509-value [ 
ontology:timeCalendarModel \"animals\" ] ] }")
+                .toString()));
+        assertFalse(rdfRepository.ask(Ontology.prefix(entityUris.prefixes(new 
StringBuilder()))
+                .append("ASK { entity:Q23 entity:P509 [ v:P509-value [ 
ontology:timeTime \"cat\" ] ] }").toString()));
+    }
+
+    @Test
+    public void referenceWithExpandedValue() throws QueryEvaluationException {
+        String statementUri = entityUris.statement().namespace() + 
"someotheruuid";
+        String referenceUri = entityUris.reference().namespace() + 
"yetanotheruri";
+        String valueUri = entityUris.value().namespace() + "someuuid";
+        List<Statement> george = new ArrayList<>();
+        statement(george, "Q23", "P509", statementUri);
+        statement(george, statementUri, Provenance.WAS_DERIVED_FROM, 
referenceUri);
+        statement(george, referenceUri, entityUris.value().namespace() + 
"P509-value", valueUri);
+        statement(george, valueUri, Ontology.Time.VALUE, new 
LiteralImpl("cat"));
+        statement(george, valueUri, Ontology.Time.CALENDAR_MODEL, new 
LiteralImpl("animals"));
+        rdfRepository.sync("Q23", george);
+        assertTrue(rdfRepository
+                .ask(Provenance
+                        .prefix(Ontology.prefix(entityUris.prefixes(new 
StringBuilder())))
+                        .append("ASK { entity:Q23 entity:P509 [ 
prov:wasDerivedFrom [ v:P509-value [ ontology:timeTime \"cat\" ] ] ] }")
+                        .toString()));
+        assertTrue(rdfRepository
+                .ask(Provenance
+                        .prefix(Ontology.prefix(entityUris.prefixes(new 
StringBuilder())))
+                        .append("ASK { entity:Q23 entity:P509 [ 
prov:wasDerivedFrom [ v:P509-value [ ontology:timeCalendarModel \"animals\" ] ] 
] }")
+                .toString()));
+    }
+
+    @Test
+    public void referenceWithExpandedValueChanged() throws 
QueryEvaluationException {
+        referenceWithExpandedValue();
+        String statementUri = entityUris.statement().namespace() + 
"someotheruuid";
+        String referenceUri = entityUris.reference().namespace() + 
"yetanotheruri";
+        String valueUri = entityUris.value().namespace() + "someuuid";
+        List<Statement> george = new ArrayList<>();
+        statement(george, "Q23", "P509", statementUri);
+        statement(george, statementUri, Provenance.WAS_DERIVED_FROM, 
referenceUri);
+        statement(george, referenceUri, entityUris.value().namespace() + 
"P509-value", valueUri);
+        statement(george, valueUri, Ontology.Time.VALUE, new 
LiteralImpl("dog"));
+        statement(george, valueUri, Ontology.Time.CALENDAR_MODEL, new 
LiteralImpl("animals"));
+        rdfRepository.sync("Q23", george);
+        assertTrue(rdfRepository
+                .ask(Provenance
+                        .prefix(Ontology.prefix(entityUris.prefixes(new 
StringBuilder())))
+                        .append("ASK { entity:Q23 entity:P509 [ 
prov:wasDerivedFrom [ v:P509-value [ ontology:timeTime \"dog\" ] ] ] }")
+                        .toString()));
+        assertTrue(rdfRepository
+                .ask(Provenance
+                        .prefix(Ontology.prefix(entityUris.prefixes(new 
StringBuilder())))
+                        .append("ASK { entity:Q23 entity:P509 [ 
prov:wasDerivedFrom [ v:P509-value [ ontology:timeCalendarModel \"animals\" ] ] 
] }")
+                        .toString()));
+        assertFalse(rdfRepository
+                .ask(Provenance
+                        .prefix(Ontology.prefix(entityUris.prefixes(new 
StringBuilder())))
+                        .append("ASK { entity:Q23 entity:P509 [ 
prov:wasDerivedFrom [ v:P509-value [ ontology:timeTime \"cat\" ] ] ] }")
+                .toString()));
+    }
+
+    @Test
     public void referencesOnExpandedStatements() throws 
QueryEvaluationException {
         String referenceUri = entityUris.reference().namespace() + 
"e36b7373814a0b74caa84a5fc2b1e3297060ab0f";
         List<Statement> george = 
expandedStatement("9D3713FF-7BCC-489F-9386-C7322C0AC284", "Q23", "P19", 
"Q494413",

-- 
To view, visit https://gerrit.wikimedia.org/r/202775
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I5fb72c256d2f3f3c8e2478c84026bb657ad49e0f
Gerrit-PatchSet: 1
Gerrit-Project: wikidata/query/rdf
Gerrit-Branch: master
Gerrit-Owner: Manybubbles <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to