jenkins-bot has submitted this change and it was merged.
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, 340 insertions(+), 11 deletions(-)
Approvals:
Manybubbles: Looks good to me, approved
jenkins-bot: Verified
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 e17199d..2959690 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
@@ -207,19 +207,32 @@
private boolean statement() throws ContainedException {
subject = statement.getSubject().stringValue();
predicate = statement.getPredicate().stringValue();
- if (subject.startsWith(uris.entityData())) {
+ if (inNamespace(subject, uris.entityData())) {
return entityDataStatement();
}
- if (subject.startsWith(uris.statement())) {
+ if (inNamespace(subject, uris.statement())) {
return entityStatementStatement();
}
- if (subject.startsWith(uris.reference())) {
+ if (inNamespace(subject, uris.reference())) {
return entityReferenceStatement();
}
- if (subject.startsWith(uris.entity())) {
+ if (inNamespace(subject, uris.value())) {
+ return entityValueStatement();
+ }
+ if (inNamespace(subject, uris.entity())) {
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;
}
/**
@@ -279,7 +292,7 @@
// Lets just fall out to save some whitespace
}
String object = statement.getObject().stringValue();
- if (predicate.startsWith(uris.entity()) &&
object.startsWith(uris.statement())) {
+ if (inNamespace(predicate, uris.entity()) && inNamespace(object,
uris.statement())) {
registerExtraValidSubject(object);
}
// Most statements should be kept.
@@ -304,7 +317,7 @@
break;
case Provenance.WAS_DERIVED_FROM:
String object = statement.getObject().stringValue();
- if (object.startsWith(uris.reference())) {
+ if (inNamespace(object, uris.reference())) {
registerExtraValidSubject(object);
}
return true;
@@ -319,6 +332,10 @@
*/
unknownSubjects.put(subject, statement);
return false;
+ }
+ String object = statement.getObject().stringValue();
+ if (inNamespace(object, uris.value())) {
+ registerExtraValidSubject(object);
}
return true;
}
@@ -351,6 +368,41 @@
unknownSubjects.put(subject, statement);
return false;
}
+ String object = statement.getObject().stringValue();
+ if (inNamespace(predicate, uris.value()) && inNamespace(object,
uris.value())) {
+ 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;
}
@@ -364,6 +416,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 25e774a..cf47fab 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
@@ -86,6 +86,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",
uris.statement()));
+ valuesOnReferencesBuilder.where("?statement", "prov:wasDerivedFrom",
"?ref");
+ valuesOnReferencesBuilder.where("?ref", "?expandedValuePred", "?s");
+ valuesOnReferencesBuilder.where().add(startsWith("?expandedValuePred",
uris.value()));
+ 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");
@@ -100,6 +118,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",
uris.statement()));
+ valuesOnExpandedStatementsBuilder.where("?statement",
"?expandedValuePred", "?s");
+
valuesOnExpandedStatementsBuilder.where().add(startsWith("?expandedValuePred",
uris.value()));
+ valuesOnExpandedStatementsBuilder.where("?s", "?p", "?o");
+ if (!statements.isEmpty()) {
+
valuesOnExpandedStatementsBuilder.where().notExists().values(statements, "?s",
"?p", "?o");
}
UpdateBuilder expandedStatementsBuilder = updateBuilder();
@@ -127,7 +156,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 ab28b8f..4f909b6 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
@@ -28,7 +28,7 @@
Munge.Httpd http = new Munge.Httpd(10999, uris, new
Munger(uris).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 21e9782..ec83423 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.Ontology;
@@ -182,9 +184,125 @@
assertThat(george, hasItem(qualifierDecl));
}
- // TODO expanded values
+ @Test
+ public void basicExpandedValue() {
+ List<Statement> universe = basicEntity("Q1");
+ String statementUri = uris.statement() + "q1-someuuid";
+ String valueUri = uris.value() + "someotheruuid";
+ Statement statementDecl = statement(universe, "Q1", "P580",
statementUri);
+ Statement statementTypeDecl = statement(universe, statementUri,
RDF.TYPE, Ontology.STATEMENT);
+ Statement valueDecl = statement(universe, statementUri, uris.value() +
"P580",
+ new LiteralImpl("-13798000000-01-01T00:00:00Z",
XMLSchema.DATETIME));
+ Statement expandedValueDecl = statement(universe, statementUri,
uris.value() + "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 expandedValueOnQualifier() {
+ List<Statement> universe = basicEntity("Q1");
+ String statementUri = uris.statement() + "q1-someuuid";
+ String valueUri = uris.value() + "someotheruuid";
+ Statement statementDecl = statement(universe, "Q1", "P580",
statementUri);
+ Statement statementTypeDecl = statement(universe, statementUri,
RDF.TYPE, Ontology.STATEMENT);
+ Statement valueDecl = statement(universe, statementUri,
uris.qualifier() + "P580",
+ new LiteralImpl("-13798000000-01-01T00:00:00Z",
XMLSchema.DATETIME));
+ Statement expandedValueDecl = statement(universe, statementUri,
uris.value() + "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 = uris.statement() + "q1-someuuid";
+ String valueUri = uris.value() + "someotheruuid";
+ String referenceUri = uris.reference() + "yetanotheruuid";
+ Statement statementDecl = statement(universe, "Q1", "P580",
statementUri);
+ Statement statementTypeDecl = statement(universe, statementUri,
RDF.TYPE, Ontology.STATEMENT);
+ Statement valueDecl = statement(universe, statementUri, uris.value() +
"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,
uris.value() + "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 8031391..9a2c48f 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 = uris.statement() + "someotheruuid";
+ String valueUri = uris.value() + "someuuid";
+ List<Statement> george = new ArrayList<>();
+ statement(george, "Q23", "P509", statementUri);
+ statement(george, statementUri, uris.value() + "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(uris.prefixes(new StringBuilder()))
+ .append("ASK { entity:Q23 entity:P509 [ v:P509-value [
ontology:timeTime \"cat\" ] ] }")
+ .toString()));
+ assertTrue(rdfRepository.ask(Ontology.prefix(uris.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 = uris.statement() + "someotheruuid";
+ String valueUri = uris.value() + "someuuid";
+ List<Statement> george = new ArrayList<>();
+ statement(george, "Q23", "P509", statementUri);
+ statement(george, statementUri, uris.value() + "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(uris.prefixes(new
StringBuilder()))
+ .append("ASK { entity:Q23 entity:P509 [ v:P509-value [
ontology:timeTime \"dog\" ] ] }").toString()));
+ assertTrue(rdfRepository.ask(Ontology.prefix(uris.prefixes(new
StringBuilder()))
+ .append("ASK { entity:Q23 entity:P509 [ v:P509-value [
ontology:timeCalendarModel \"animals\" ] ] }")
+ .toString()));
+ assertFalse(rdfRepository.ask(Ontology.prefix(uris.prefixes(new
StringBuilder()))
+ .append("ASK { entity:Q23 entity:P509 [ v:P509-value [
ontology:timeTime \"cat\" ] ] }").toString()));
+ }
+
+ @Test
+ public void referenceWithExpandedValue() throws QueryEvaluationException {
+ String statementUri = uris.statement() + "someotheruuid";
+ String referenceUri = uris.reference() + "yetanotheruri";
+ String valueUri = uris.value() + "someuuid";
+ List<Statement> george = new ArrayList<>();
+ statement(george, "Q23", "P509", statementUri);
+ statement(george, statementUri, Provenance.WAS_DERIVED_FROM,
referenceUri);
+ statement(george, referenceUri, uris.value() + "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(uris.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(uris.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 = uris.statement() + "someotheruuid";
+ String referenceUri = uris.reference() + "yetanotheruri";
+ String valueUri = uris.value() + "someuuid";
+ List<Statement> george = new ArrayList<>();
+ statement(george, "Q23", "P509", statementUri);
+ statement(george, statementUri, Provenance.WAS_DERIVED_FROM,
referenceUri);
+ statement(george, referenceUri, uris.value() + "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(uris.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(uris.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(uris.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 = uris.reference() +
"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: merged
Gerrit-Change-Id: I5fb72c256d2f3f3c8e2478c84026bb657ad49e0f
Gerrit-PatchSet: 4
Gerrit-Project: wikidata/query/rdf
Gerrit-Branch: master
Gerrit-Owner: Manybubbles <[email protected]>
Gerrit-Reviewer: Jdouglas <[email protected]>
Gerrit-Reviewer: Manybubbles <[email protected]>
Gerrit-Reviewer: Smalyshev <[email protected]>
Gerrit-Reviewer: jenkins-bot <>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits