jenkins-bot has submitted this change and it was merged.
Change subject: Change how values/refs are handled
......................................................................
Change how values/refs are handled
New approach goes as follows:
1. Collect the list of references and values linked to the entity
2. When munging, do not add statement for existing references/entities
3. Remove all references/entities mentioned by the new data from the list
4. Run the update for the statement data, deleting old statements
5. Run the delete query for non-connected references/values, taking them from
the list in (3)
Change-Id: I0397dc10fb7fbaf0d11433c31728ed8e28f58d84
---
M tools/src/main/java/org/wikidata/query/rdf/tool/Update.java
M tools/src/main/java/org/wikidata/query/rdf/tool/rdf/Munger.java
A
tools/src/main/java/org/wikidata/query/rdf/tool/rdf/RdfRepository.CleanUnused.sparql
A
tools/src/main/java/org/wikidata/query/rdf/tool/rdf/RdfRepository.GetRefs.sparql
A
tools/src/main/java/org/wikidata/query/rdf/tool/rdf/RdfRepository.GetValues.sparql
M tools/src/main/java/org/wikidata/query/rdf/tool/rdf/RdfRepository.java
M tools/src/main/java/org/wikidata/query/rdf/tool/rdf/RdfRepository.sync.sparql
M tools/src/main/java/org/wikidata/query/rdf/tool/rdf/UpdateBuilder.java
M
tools/src/main/java/org/wikidata/query/rdf/tool/wikibase/WikibaseRepository.java
M
tools/src/test/java/org/wikidata/query/rdf/tool/rdf/RdfRepositoryIntegrationTest.java
10 files changed, 209 insertions(+), 89 deletions(-)
Approvals:
Manybubbles: Looks good to me, approved
jenkins-bot: Verified
diff --git a/tools/src/main/java/org/wikidata/query/rdf/tool/Update.java
b/tools/src/main/java/org/wikidata/query/rdf/tool/Update.java
index 6f35f17..3882e59 100644
--- a/tools/src/main/java/org/wikidata/query/rdf/tool/Update.java
+++ b/tools/src/main/java/org/wikidata/query/rdf/tool/Update.java
@@ -11,6 +11,7 @@
import java.util.Date;
import java.util.List;
import java.util.Locale;
+import java.util.Set;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
@@ -266,8 +267,14 @@
return;
}
Collection<Statement> statements =
wikibase.fetchRdfForEntity(change.entityId());
- munger.munge(change.entityId(), statements);
+ Set<String> values = rdfRepository.getValues(change.entityId());
+ Set<String> refs = rdfRepository.getRefs(change.entityId());
+ munger.munge(change.entityId(), statements, values, refs);
rdfRepository.sync(change.entityId(), statements);
+ List<String> cleanupList = new ArrayList<>();
+ cleanupList.addAll(values);
+ cleanupList.addAll(refs);
+ rdfRepository.cleanUnused(cleanupList);
updateMeter.mark();
}
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 fcf573d..ccd2143 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
@@ -3,6 +3,7 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
+import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
@@ -112,16 +113,34 @@
* RDF exports into a more queryable form.
*
* @param statements statements to munge
+ * @param existingValues Existing value statements
+ * @param existingRefs Existing reference statements
*/
- public void munge(String entityId, Collection<Statement> statements)
throws ContainedException {
+ public void munge(String entityId, Collection<Statement> statements,
+ Collection<String> existingValues, Collection<String> existingRefs)
throws ContainedException {
if (statements.isEmpty()) {
// Empty collection is a delete.
return;
}
- MungeOperation op = new MungeOperation(entityId, statements);
+ MungeOperation op = new MungeOperation(entityId, statements,
existingValues, existingRefs);
op.munge();
+ // remove all values that we have seen as they are used by statements
+ existingValues.removeAll(op.extraValidSubjects);
+ existingRefs.removeAll(op.extraValidSubjects);
return;
}
+
+ /**
+ * Adds and removes entries from the statements collection to munge
Wikibase
+ * RDF exports into a more queryable form.
+ *
+ * @param statements statements to munge
+ */
+ @SuppressWarnings("unchecked")
+ public void munge(String entityId, Collection<Statement> statements) {
+ munge(entityId, statements, Collections.EMPTY_SET,
Collections.EMPTY_SET);
+ }
+
/**
* Holds state during a single munge operation.
@@ -174,7 +193,10 @@
private String subject;
private String predicate;
- public MungeOperation(String entityId, Collection<Statement>
statements) {
+ private final Collection<String> existingValues;
+ private final Collection<String> existingRefs;
+
+ public MungeOperation(String entityId, Collection<Statement>
statements, Collection<String> existingValues, Collection<String> existingRefs)
{
this.statements = statements;
entityUri = uris.entity() + entityId;
entityUriImpl = new URIImpl(entityUri);
@@ -185,6 +207,8 @@
singleLabelModeWorkForLabel = null;
singleLabelModeWorkForDescription = null;
}
+ this.existingValues = existingValues;
+ this.existingRefs = existingRefs;
}
public void munge() throws ContainedException {
@@ -348,17 +372,23 @@
* @return true to keep the statement, false to remove it
*/
private boolean entityReferenceStatement() throws ContainedException {
+ if(existingRefs.contains(subject)) {
+ /* We already have this ref, so no need to import it again
+ * Since refs are IDed by content, we know it is the same
+ */
+ return false;
+ }
switch (predicate) {
- case RDF.TYPE:
- /*
- * We don't need r:<uuid> a ontology:Reference because its
super
- * common and not super interesting.
- */
- if
(statement.getObject().stringValue().equals(Ontology.REFERENCE)) {
- return false;
- }
- break;
- default:
+ case RDF.TYPE:
+ /*
+ * We don't need r:<uuid> a ontology:Reference because its
super
+ * common and not super interesting.
+ */
+ if
(statement.getObject().stringValue().equals(Ontology.REFERENCE)) {
+ return false;
+ }
+ break;
+ default:
}
if (!extraValidSubjects.contains(subject)) {
/*
@@ -383,6 +413,12 @@
* @return true to keep the statement, false to remove it
*/
private boolean entityValueStatement() throws ContainedException {
+ if(existingValues.contains(subject)) {
+ /* We already have this value, so no need to import it again
+ * Since values are IDed by content, we know it is the same
+ */
+ return false;
+ }
switch (predicate) {
case RDF.TYPE:
/*
diff --git
a/tools/src/main/java/org/wikidata/query/rdf/tool/rdf/RdfRepository.CleanUnused.sparql
b/tools/src/main/java/org/wikidata/query/rdf/tool/rdf/RdfRepository.CleanUnused.sparql
new file mode 100644
index 0000000..edecc15
--- /dev/null
+++
b/tools/src/main/java/org/wikidata/query/rdf/tool/rdf/RdfRepository.CleanUnused.sparql
@@ -0,0 +1,7 @@
+DELETE { ?s ?p ?o } WHERE {
+ VALUES ?s { %values% }
+ # Since values are shared we can only clear the values on them when they are
no longer used
+ # anywhere else.
+ FILTER NOT EXISTS { ?someEntity ?someStatementPred ?s . }
+ ?s ?p ?o .
+}
diff --git
a/tools/src/main/java/org/wikidata/query/rdf/tool/rdf/RdfRepository.GetRefs.sparql
b/tools/src/main/java/org/wikidata/query/rdf/tool/rdf/RdfRepository.GetRefs.sparql
new file mode 100644
index 0000000..cfb03b6
--- /dev/null
+++
b/tools/src/main/java/org/wikidata/query/rdf/tool/rdf/RdfRepository.GetRefs.sparql
@@ -0,0 +1,6 @@
+SELECT DISTINCT ?s
+WHERE {
+ %entity:id% ?statementPred ?statement .
+ FILTER( STRSTARTS(STR(?statement), "%uris.statement%") ) .
+ ?statement %prov:wasDerivedFrom% ?s .
+}
diff --git
a/tools/src/main/java/org/wikidata/query/rdf/tool/rdf/RdfRepository.GetValues.sparql
b/tools/src/main/java/org/wikidata/query/rdf/tool/rdf/RdfRepository.GetValues.sparql
new file mode 100644
index 0000000..55cac7b
--- /dev/null
+++
b/tools/src/main/java/org/wikidata/query/rdf/tool/rdf/RdfRepository.GetValues.sparql
@@ -0,0 +1,11 @@
+SELECT DISTINCT ?s
+WHERE {
+ %entity:id% ?statementPred ?statement .
+ FILTER( STRSTARTS(STR(?statement), "%uris.statement%") ) .
+ { ?statement %prov:wasDerivedFrom% ?ref .
+ ?ref ?expandedValuePred ?s .
+ } UNION {
+ ?statement ?somePred ?s .
+ }
+ FILTER( STRSTARTS(STR(?s), "%uris.value%") ) .
+}
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 6219fed..f6143ef 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
@@ -11,8 +11,10 @@
import java.util.Collection;
import java.util.Date;
import java.util.GregorianCalendar;
+import java.util.HashSet;
import java.util.List;
import java.util.Locale;
+import java.util.Set;
import java.util.TimeZone;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -65,14 +67,21 @@
.build();
private final URI uri;
private final WikibaseUris uris;
+ // SPARQL queries
private final String syncBody;
private final String updateLeftOffTimeBody;
+ private final String getValues;
+ private final String getRefs;
+ private final String cleanUnused;
public RdfRepository(URI uri, WikibaseUris uris) {
this.uri = uri;
this.uris = uris;
syncBody = loadBody("sync");
updateLeftOffTimeBody = loadBody("updateLeftOffTime");
+ getValues = loadBody("GetValues");
+ getRefs = loadBody("GetRefs");
+ cleanUnused = loadBody("CleanUnused");
}
/**
@@ -93,6 +102,75 @@
}
/**
+ * Collect results of the query into string set.
+ * @param result Result object
+ * @param binding Binding name to collect
+ * @return Collection of strings resulting from the query.
+ */
+ private Set<String> resultToSet(TupleQueryResult result, String binding) {
+ HashSet<String> values = new HashSet<String>();
+ try {
+ while(result.hasNext()) {
+ Binding value = result.next().getBinding(binding);
+ if (value == null) {
+ continue;
+ }
+ values.add(value.getValue().stringValue());
+ }
+ } catch(QueryEvaluationException e) {
+ throw new FatalException("Can't load results: " + e, e);
+ }
+ return values;
+ }
+
+ /**
+ * Get list of value subjects connected to entity.
+ * The connection is either via statement or via reference or via
qualifier.
+ * @param entityId
+ * @return Set of value subjects
+ */
+ public Set<String> getValues(String entityId) {
+ UpdateBuilder b = new UpdateBuilder(getValues);
+ b.bindUri("entity:id", uris.entity() + entityId);
+ b.bind("uris.value", uris.value());
+ b.bind("uris.statement", uris.statement());
+ b.bindUri("prov:wasDerivedFrom", Provenance.WAS_DERIVED_FROM);
+
+ return resultToSet(query(b.toString()), "s");
+ }
+
+ /**
+ * Get list of reference subjects connected to entity.
+ * @param entityId
+ * @return Set of references
+ */
+ public Set<String> getRefs(String entityId) {
+ UpdateBuilder b = new UpdateBuilder(getRefs);
+ b.bindUri("entity:id", uris.entity() + entityId);
+ b.bind("uris.statement", uris.statement());
+ b.bindUri("prov:wasDerivedFrom", Provenance.WAS_DERIVED_FROM);
+
+ return resultToSet(query(b.toString()), "s");
+ }
+
+ /**
+ * Clean subjects if they are not used anymore.
+ * The candidate values do not have to be actually unused - the cleanup
query
+ * will figure out which are unused and delete only those.
+ * @param valueList List of potential candidates for cleanup.
+ */
+ public void cleanUnused(Collection<String> valueList) {
+ if(valueList.isEmpty()) {
+ return;
+ }
+ long start = System.currentTimeMillis();
+ UpdateBuilder b = new UpdateBuilder(cleanUnused);
+ b.bindUris("values", valueList);
+ int modified = execute("update", UPDATE_COUNT_RESPONSE, b.toString());
+ log.debug("Cleanup {} millis and modified {} statements",
System.currentTimeMillis() - start, modified);
+ }
+
+ /**
* Synchronizes the RDF repository's representation of an entity to be
* exactly the provided statements. You can think of the RDF managed for an
* entity as a tree rooted at the entity. The managed tree ends where the
diff --git
a/tools/src/main/java/org/wikidata/query/rdf/tool/rdf/RdfRepository.sync.sparql
b/tools/src/main/java/org/wikidata/query/rdf/tool/rdf/RdfRepository.sync.sparql
index c30cb0b..a94d8c6 100644
---
a/tools/src/main/java/org/wikidata/query/rdf/tool/rdf/RdfRepository.sync.sparql
+++
b/tools/src/main/java/org/wikidata/query/rdf/tool/rdf/RdfRepository.sync.sparql
@@ -13,73 +13,7 @@
}
}
};
-# Clear statements on expanded values in referenes that are no longer used
-DELETE {
- ?s ?p ?o .
-}
-WHERE {
- %entity:id% ?statementPred ?statement .
- FILTER( STRSTARTS(STR(?statement), "%uris.statement%") ) .
- ?statement %prov:wasDerivedFrom% ?ref .
- # Since references are shared we can only clear the values on them when they
are no longer used
- # anywhere else.
- FILTER NOT EXISTS {
- ?otherStatement %prov:wasDerivedFrom% ?ref .
- ?otherEntity ?otherStatementPred ?otherStatement .
- FILTER ( %entity:id% != ?otherEntity ) .
- }
- ?ref ?expandedValuePred ?s .
- # Without this filter we'd try to delete stuff from entities. For example
that pattern above matches
- # ref:_ v:P143 entity:Q328
- # so we'd try to clear everything from Q328 (enwiki). So we filter where ?s
is in the value prefix.
- FILTER( STRSTARTS(STR(?s), "%uris.value%") ) .
- ?s ?p ?o .
- FILTER NOT EXISTS {
- VALUES ( ?s ?p ?o ) {
- %valueStatements%
- }
- }
-};
-# Clear statements about references that are no longer used
-DELETE {
- ?s ?p ?o .
-}
-WHERE {
- %entity:id% ?statementPred ?statement .
- FILTER( STRSTARTS(STR(?statement), "%uris.statement%") ) .
- ?statement %prov:wasDerivedFrom% ?s .
- # Since references are shared we can only clear the values on them when they
are no longer used
- # anywhere else.
- FILTER NOT EXISTS {
- ?otherStatement %prov:wasDerivedFrom% ?s .
- ?otherEntity ?otherStatementPred ?otherStatement .
- FILTER ( %entity:id% != ?otherEntity ) .
- }
- ?s ?p ?o .
- FILTER NOT EXISTS {
- VALUES ( ?s ?p ?o ) {
- %valueStatements%
- }
- }
-};
-# Clear out of date expanded values on statements about the entity
-DELETE {
- ?s ?p ?o .
-}
-WHERE {
- %entity:id% ?statementPred ?statement .
- FILTER( STRSTARTS(STR(?statement), "%uris.statement%") ) .
- ?statement ?expandedValuePred ?s .
- # Without this filter we'd clear all kinds of things. Only try and clear
value nodes.
- FILTER( STRSTARTS(STR(?s), "%uris.value%") ) .
- ?s ?p ?o .
- FILTER NOT EXISTS {
- VALUES ( ?s ?p ?o ) {
- %valueStatements%
- }
- }
-};
-# Clear out of date statements about statements
+# Clear out of date statements about statements
DELETE {
?s ?p ?o .
}
@@ -107,6 +41,5 @@
};
INSERT {
%insertStatements%
-}
-WHERE {};
+} WHERE {}
diff --git
a/tools/src/main/java/org/wikidata/query/rdf/tool/rdf/UpdateBuilder.java
b/tools/src/main/java/org/wikidata/query/rdf/tool/rdf/UpdateBuilder.java
index bdd9d6a..3a2fea7 100644
--- a/tools/src/main/java/org/wikidata/query/rdf/tool/rdf/UpdateBuilder.java
+++ b/tools/src/main/java/org/wikidata/query/rdf/tool/rdf/UpdateBuilder.java
@@ -65,6 +65,16 @@
return this;
}
+ public UpdateBuilder bindUris(String from, Collection<String> uris) {
+ StringBuilder b = new StringBuilder(uris.size() * 80);
+
+ for (String s : uris) {
+ b.append('<').append(s).append("> ");
+ }
+ bind(from, b.toString().trim());
+ return this;
+ }
+
@Override
public String toString() {
return template;
diff --git
a/tools/src/main/java/org/wikidata/query/rdf/tool/wikibase/WikibaseRepository.java
b/tools/src/main/java/org/wikidata/query/rdf/tool/wikibase/WikibaseRepository.java
index 2388dc9..4475788 100644
---
a/tools/src/main/java/org/wikidata/query/rdf/tool/wikibase/WikibaseRepository.java
+++
b/tools/src/main/java/org/wikidata/query/rdf/tool/wikibase/WikibaseRepository.java
@@ -244,7 +244,7 @@
* not all Wikibase instances have the rewrite rule set up.
*/
builder.setPath(String.format(Locale.ROOT,
"/wiki/Special:EntityData/%s.ttl", title));
- builder.addParameter("nocache", "");
+ builder.addParameter("nocache", "1");
builder.addParameter("flavor", "dump");
return build(builder);
}
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 f911f86..36f525f 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
@@ -7,11 +7,15 @@
import java.math.BigInteger;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.Collections;
import java.util.Date;
+import java.util.HashSet;
import java.util.List;
import java.util.Locale;
+import java.util.Set;
+import org.junit.Before;
import org.junit.Test;
import org.openrdf.model.Statement;
import org.openrdf.model.impl.IntegerLiteralImpl;
@@ -31,6 +35,13 @@
* Tests RdfRepository against a live RDF repository.
*/
public class RdfRepositoryIntegrationTest extends
AbstractRdfRepositoryIntegrationTestBase {
+ private Set<String> cleanupList = new HashSet<String>();
+
+ @Before
+ public void cleanList() {
+ cleanupList = new HashSet<String>();
+ }
+
@Test
public void newSiteLink() throws QueryEvaluationException {
rdfRepository.sync("Q23", siteLink("Q23",
"http://en.wikipedia.org/wiki/George_Washington", "en"));
@@ -196,6 +207,7 @@
public void expandedStatementWithExpandedValue() throws
QueryEvaluationException {
String statementUri = uris.statement() + "someotheruuid";
String valueUri = uris.value() + "someuuid";
+ cleanupList.add(valueUri);
List<Statement> george = new ArrayList<>();
statement(george, "Q23", "P509", statementUri);
statement(george, statementUri, uris.value() + "P509-value", valueUri);
@@ -213,13 +225,18 @@
public void expandedStatementWithExpandedValueChanged() throws
QueryEvaluationException {
expandedStatementWithExpandedValue();
String statementUri = uris.statement() + "someotheruuid";
- String valueUri = uris.value() + "someuuid";
+ String valueUri = uris.value() + "newuuid";
+ cleanupList.add(valueUri);
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);
+ Collection<String> cleanupList = new ArrayList<String>();
+ cleanupList.add(valueUri);
+ cleanupList.add(uris.value() + "someuuid");
+ rdfRepository.cleanUnused(cleanupList);
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()))
@@ -234,6 +251,8 @@
String statementUri = uris.statement() + "someotheruuid";
String referenceUri = uris.reference() + "yetanotheruri";
String valueUri = uris.value() + "someuuid";
+ cleanupList.add(valueUri);
+ cleanupList.add(referenceUri);
List<Statement> george = new ArrayList<>();
statement(george, "Q23", "P509", statementUri);
statement(george, statementUri, Provenance.WAS_DERIVED_FROM,
referenceUri);
@@ -268,8 +287,10 @@
public void referenceWithExpandedValueChanged() throws
QueryEvaluationException {
referenceWithExpandedValue();
String statementUri = uris.statement() + "someotheruuid";
- String referenceUri = uris.reference() + "yetanotheruri";
- String valueUri = uris.value() + "someuuid";
+ String referenceUri = uris.reference() + "andanotheruri";
+ String valueUri = uris.value() + "someuuid2";
+ cleanupList.add(valueUri);
+ cleanupList.add(referenceUri);
List<Statement> george = new ArrayList<>();
statement(george, "Q23", "P509", statementUri);
statement(george, statementUri, Provenance.WAS_DERIVED_FROM,
referenceUri);
@@ -277,6 +298,7 @@
statement(george, valueUri, Ontology.Time.VALUE, new
LiteralImpl("dog"));
statement(george, valueUri, Ontology.Time.CALENDAR_MODEL, new
LiteralImpl("animals"));
rdfRepository.sync("Q23", george);
+ rdfRepository.cleanUnused(cleanupList);
assertTrue(rdfRepository
.ask(Provenance
.prefix(Ontology.prefix(uris.prefixes(new
StringBuilder())))
@@ -308,7 +330,9 @@
List<Statement> george =
expandedStatement("9D3713FF-7BCC-489F-9386-C7322C0AC284", "Q23", "P19",
"Q494413",
Ontology.NORMAL_RANK, referenceUri);
statement(george, referenceUri, uris.value() + "P854",
"http://www.anb.org/articles/02/02-00332.html");
+ cleanupList.add(referenceUri);
rdfRepository.sync("Q23", george);
+ rdfRepository.cleanUnused(cleanupList);
StringBuilder query =
Provenance.prefix(Ontology.prefix(uris.prefixes(new StringBuilder())));
query.append("SELECT * WHERE { entity:Q23 entity:P19 [ v:P19
?placeOfBirth; prov:wasDerivedFrom [ ?provP ?provO ] ] }");
TupleQueryResult r = rdfRepository.query(query.toString());
@@ -323,11 +347,13 @@
@Test
public void referencesOnExpandedStatementsChangeValue() throws
QueryEvaluationException {
referencesOnExpandedStatements();
- String referenceUri = uris.reference() +
"e36b7373814a0b74caa84a5fc2b1e3297060ab0f";
+ String referenceUri = uris.reference() +
"new-e36b7373814a0b74caa84a5fc2b1e3297060ab0f";
List<Statement> george =
expandedStatement("9D3713FF-7BCC-489F-9386-C7322C0AC284", "Q23", "P19",
"Q494413",
Ontology.NORMAL_RANK, referenceUri);
+ cleanupList.add(referenceUri);
statement(george, referenceUri, uris.value() + "P854",
"http://example.com");
rdfRepository.sync("Q23", george);
+ rdfRepository.cleanUnused(cleanupList);
StringBuilder query =
Provenance.prefix(Ontology.prefix(uris.prefixes(new StringBuilder())));
query.append("SELECT * WHERE { entity:Q23 entity:P19 [ v:P19
?placeOfBirth; prov:wasDerivedFrom [ ?provP ?provO ] ] }");
TupleQueryResult r = rdfRepository.query(query.toString());
@@ -342,11 +368,13 @@
@Test
public void referencesOnExpandedStatementsChangePredicate() throws
QueryEvaluationException {
referencesOnExpandedStatements();
- String referenceUri = uris.reference() +
"e36b7373814a0b74caa84a5fc2b1e3297060ab0f";
+ String referenceUri = uris.reference() +
"new-e36b7373814a0b74caa84a5fc2b1e3297060ab0f";
List<Statement> george =
expandedStatement("9D3713FF-7BCC-489F-9386-C7322C0AC284", "Q23", "P19",
"Q494413",
Ontology.NORMAL_RANK, referenceUri);
+ cleanupList.add(referenceUri);
statement(george, referenceUri, uris.value() + "P143",
"http://www.anb.org/articles/02/02-00332.html");
rdfRepository.sync("Q23", george);
+ rdfRepository.cleanUnused(cleanupList);
StringBuilder query =
Provenance.prefix(Ontology.prefix(uris.prefixes(new StringBuilder())));
query.append("SELECT * WHERE { entity:Q23 entity:P19 [ v:P19
?placeOfBirth; prov:wasDerivedFrom [ ?provP ?provO ] ] }");
TupleQueryResult r = rdfRepository.query(query.toString());
@@ -364,6 +392,7 @@
String referenceUri = uris.reference() +
"e36b7373814a0b74caa84a5fc2b1e3297060ab0f";
List<Statement> george =
expandedStatement("9D3713FF-7BCC-489F-9386-C7322C0AC284", "Q23", "P19",
"Q494413",
Ontology.NORMAL_RANK, referenceUri);
+ cleanupList.add(referenceUri);
Statement refDecl = statement(george, referenceUri, uris.value() +
"P854",
"http://www.anb.org/articles/02/02-00332.html");
rdfRepository.sync("Q23", george);
@@ -371,6 +400,7 @@
Ontology.NORMAL_RANK, referenceUri);
dummy.add(refDecl);
rdfRepository.sync("Q1234134", dummy);
+ rdfRepository.cleanUnused(cleanupList);
// Now query and make sure you can find it
StringBuilder query =
Provenance.prefix(Ontology.prefix(uris.prefixes(new StringBuilder())));
@@ -414,6 +444,7 @@
george = expandedStatement("9D3713FF-7BCC-489F-9386-C7322C0AC284",
"Q23", "P19", "Q494413",
Ontology.NORMAL_RANK);
rdfRepository.sync("Q23", george);
+ rdfRepository.cleanUnused(cleanupList);
/*
* Now query and find the reference now gone because it isn't used
@@ -436,6 +467,7 @@
String referenceUri = uris.reference() +
"e36b7373814a0b74caa84a5fc2b1e3297060ab0f";
List<Statement> george =
expandedStatement("9D3713FF-7BCC-489F-9386-C7322C0AC284", "Q23", "P19",
"Q494413",
Ontology.NORMAL_RANK, referenceUri);
+ cleanupList.add(referenceUri);
statement(george, referenceUri, uris.value() + "P854",
"http://www.anb.org/articles/02/02-00332.html");
List<Statement> georgeWithoutSecondReference = new ArrayList<>(george);
String otherStatementUri = uris.statement() + "ASDFasdf";
--
To view, visit https://gerrit.wikimedia.org/r/204225
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I0397dc10fb7fbaf0d11433c31728ed8e28f58d84
Gerrit-PatchSet: 8
Gerrit-Project: wikidata/query/rdf
Gerrit-Branch: master
Gerrit-Owner: Smalyshev <[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