From e2ae09f5bee6e2c01e76d216f6d209998908405b Mon Sep 17 00:00:00 2001 From: Antonin Delpeuch Date: Sun, 10 Jun 2018 08:14:24 +0100 Subject: [PATCH] Add support for Wikidata single best value constraint --- .../src/org/openrefine/wikidata/qa/ConstraintFetcher.java | 5 +++++ .../openrefine/wikidata/qa/WikidataConstraintFetcher.java | 6 ++++++ .../wikidata/qa/scrutinizers/SingleValueScrutinizer.java | 5 ++++- .../org/openrefine/wikidata/qa/MockConstraintFetcher.java | 5 +++++ 4 files changed, 20 insertions(+), 1 deletion(-) diff --git a/extensions/wikidata/src/org/openrefine/wikidata/qa/ConstraintFetcher.java b/extensions/wikidata/src/org/openrefine/wikidata/qa/ConstraintFetcher.java index a0f5402ee..4303c1bf6 100644 --- a/extensions/wikidata/src/org/openrefine/wikidata/qa/ConstraintFetcher.java +++ b/extensions/wikidata/src/org/openrefine/wikidata/qa/ConstraintFetcher.java @@ -104,6 +104,11 @@ public interface ConstraintFetcher { * Is this property expected to have at most one value per item? */ boolean hasSingleValue(PropertyIdValue pid); + + /** + * Is this property expected to have a single best value only? + */ + boolean hasSingleBestValue(PropertyIdValue pid); /** * Is this property expected to have distinct values? diff --git a/extensions/wikidata/src/org/openrefine/wikidata/qa/WikidataConstraintFetcher.java b/extensions/wikidata/src/org/openrefine/wikidata/qa/WikidataConstraintFetcher.java index 20036b26f..50ee412cc 100644 --- a/extensions/wikidata/src/org/openrefine/wikidata/qa/WikidataConstraintFetcher.java +++ b/extensions/wikidata/src/org/openrefine/wikidata/qa/WikidataConstraintFetcher.java @@ -79,6 +79,7 @@ public class WikidataConstraintFetcher implements ConstraintFetcher { public static String DISALLOWED_VALUES_CONSTRAINT_PID = "P2305"; public static String SINGLE_VALUE_CONSTRAINT_QID = "Q19474404"; + public static String SINGLE_BEST_VALUE_CONSTRAINT_QID = "Q52060874"; public static String DISTINCT_VALUES_CONSTRAINT_QID = "Q21502410"; public static String NO_BOUNDS_CONSTRAINT_QID = "Q51723761"; @@ -164,6 +165,11 @@ public class WikidataConstraintFetcher implements ConstraintFetcher { public boolean hasSingleValue(PropertyIdValue pid) { return getSingleConstraint(pid, SINGLE_VALUE_CONSTRAINT_QID) != null; } + + @Override + public boolean hasSingleBestValue(PropertyIdValue pid) { + return getSingleConstraint(pid, SINGLE_BEST_VALUE_CONSTRAINT_QID) != null; + } @Override public boolean hasDistinctValues(PropertyIdValue pid) { diff --git a/extensions/wikidata/src/org/openrefine/wikidata/qa/scrutinizers/SingleValueScrutinizer.java b/extensions/wikidata/src/org/openrefine/wikidata/qa/scrutinizers/SingleValueScrutinizer.java index bdd7bb3f4..0609205d1 100644 --- a/extensions/wikidata/src/org/openrefine/wikidata/qa/scrutinizers/SingleValueScrutinizer.java +++ b/extensions/wikidata/src/org/openrefine/wikidata/qa/scrutinizers/SingleValueScrutinizer.java @@ -35,6 +35,9 @@ import org.wikidata.wdtk.datamodel.interfaces.Statement; * For now this scrutinizer only checks for uniqueness at the item level (it * ignores qualifiers and references). * + * Given that all ranks are currently set to Normal, this also checks for + * single best values. + * * @author Antonin Delpeuch * */ @@ -54,7 +57,7 @@ public class SingleValueScrutinizer extends EditScrutinizer { issue.setProperty("property_entity", pid); issue.setProperty("example_entity", update.getItemId()); addIssue(issue); - } else if (_fetcher.hasSingleValue(pid)) { + } else if (_fetcher.hasSingleValue(pid) || _fetcher.hasSingleBestValue(pid)) { seenSingleProperties.add(pid); } } diff --git a/extensions/wikidata/tests/src/org/openrefine/wikidata/qa/MockConstraintFetcher.java b/extensions/wikidata/tests/src/org/openrefine/wikidata/qa/MockConstraintFetcher.java index c04e1f91f..4e3f90879 100644 --- a/extensions/wikidata/tests/src/org/openrefine/wikidata/qa/MockConstraintFetcher.java +++ b/extensions/wikidata/tests/src/org/openrefine/wikidata/qa/MockConstraintFetcher.java @@ -103,6 +103,11 @@ public class MockConstraintFetcher implements ConstraintFetcher { public boolean hasSingleValue(PropertyIdValue pid) { return true; } + + @Override + public boolean hasSingleBestValue(PropertyIdValue pid) { + return false; + } @Override public boolean hasDistinctValues(PropertyIdValue pid) {