Search in sources :

Example 66 with Snak

use of org.wikidata.wdtk.datamodel.interfaces.Snak in project OpenRefine by OpenRefine.

the class WbStatementExpr method groupSnaks.

public static List<SnakGroup> groupSnaks(List<Snak> snaks) {
    Map<PropertyIdValue, List<Snak>> snakGroups = new HashMap<>();
    List<PropertyIdValue> propertyOrder = new ArrayList<PropertyIdValue>();
    for (Snak snak : snaks) {
        List<Snak> existingSnaks = snakGroups.get(snak.getPropertyId());
        if (existingSnaks == null) {
            existingSnaks = new ArrayList<Snak>();
            snakGroups.put(snak.getPropertyId(), existingSnaks);
            propertyOrder.add(snak.getPropertyId());
        }
        if (!existingSnaks.contains(snak)) {
            existingSnaks.add(snak);
        }
    }
    return propertyOrder.stream().map(pid -> Datamodel.makeSnakGroup(snakGroups.get(pid))).collect(Collectors.toList());
}
Also used : PropertyIdValue(org.wikidata.wdtk.datamodel.interfaces.PropertyIdValue) JsonProperty(com.fasterxml.jackson.annotation.JsonProperty) SnakGroup(org.wikidata.wdtk.datamodel.interfaces.SnakGroup) HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) StatementEditingMode(org.openrefine.wikidata.schema.strategies.StatementEditingMode) Map(java.util.Map) EntityIdValue(org.wikidata.wdtk.datamodel.interfaces.EntityIdValue) Claim(org.wikidata.wdtk.datamodel.interfaces.Claim) QAWarning(org.openrefine.wikidata.qa.QAWarning) Value(org.wikidata.wdtk.datamodel.interfaces.Value) SkipSchemaExpressionException(org.openrefine.wikidata.schema.exceptions.SkipSchemaExpressionException) Reference(org.wikidata.wdtk.datamodel.interfaces.Reference) Validate(org.jsoup.helper.Validate) PropertyIdValue(org.wikidata.wdtk.datamodel.interfaces.PropertyIdValue) StatementMerger(org.openrefine.wikidata.schema.strategies.StatementMerger) Collectors(java.util.stream.Collectors) Objects(java.util.Objects) StatementRank(org.wikidata.wdtk.datamodel.interfaces.StatementRank) List(java.util.List) StatementEdit(org.openrefine.wikidata.updates.StatementEdit) Snak(org.wikidata.wdtk.datamodel.interfaces.Snak) PropertyOnlyStatementMerger(org.openrefine.wikidata.schema.strategies.PropertyOnlyStatementMerger) Datamodel(org.wikidata.wdtk.datamodel.helpers.Datamodel) JsonCreator(com.fasterxml.jackson.annotation.JsonCreator) Collections(java.util.Collections) JsonIgnoreProperties(com.fasterxml.jackson.annotation.JsonIgnoreProperties) Snak(org.wikidata.wdtk.datamodel.interfaces.Snak) HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) ArrayList(java.util.ArrayList) List(java.util.List)

Example 67 with Snak

use of org.wikidata.wdtk.datamodel.interfaces.Snak in project OpenRefine by OpenRefine.

the class SnakOnlyStatementMerger method merge.

@Override
public Statement merge(Statement existing, Statement added) {
    List<SnakGroup> existingQualifiers = existing.getQualifiers();
    List<SnakGroup> addedQualifiers = added.getQualifiers();
    // flatten snak groups
    List<Snak> existingSnaks = flatten(existingQualifiers);
    List<Snak> addedSnaks = flatten(addedQualifiers);
    List<Snak> mergedSnaks = new ArrayList<>(existingSnaks);
    for (Snak addedSnak : addedSnaks) {
        boolean matchingSnakFound = mergedSnaks.stream().anyMatch(existingSnak -> match(existingSnak, addedSnak));
        if (!matchingSnakFound) {
            mergedSnaks.add(addedSnak);
        }
    }
    List<SnakGroup> groupedQualifiers = WbStatementExpr.groupSnaks(mergedSnaks);
    Claim newClaim = Datamodel.makeClaim(existing.getSubject(), existing.getMainSnak(), groupedQualifiers);
    List<Reference> references = mergeReferences(existing.getReferences(), added.getReferences());
    return Datamodel.makeStatement(newClaim, references, existing.getRank(), existing.getStatementId());
}
Also used : SomeValueSnak(org.wikidata.wdtk.datamodel.interfaces.SomeValueSnak) Snak(org.wikidata.wdtk.datamodel.interfaces.Snak) ValueSnak(org.wikidata.wdtk.datamodel.interfaces.ValueSnak) NoValueSnak(org.wikidata.wdtk.datamodel.interfaces.NoValueSnak) Reference(org.wikidata.wdtk.datamodel.interfaces.Reference) SnakGroup(org.wikidata.wdtk.datamodel.interfaces.SnakGroup) ArrayList(java.util.ArrayList) Claim(org.wikidata.wdtk.datamodel.interfaces.Claim)

Example 68 with Snak

use of org.wikidata.wdtk.datamodel.interfaces.Snak in project OpenRefine by OpenRefine.

the class ConflictsWithScrutinizer method scrutinize.

@Override
public void scrutinize(TermedStatementEntityEdit update) {
    Map<PropertyIdValue, Set<Value>> propertyIdValueValueMap = new HashMap<>();
    for (Statement statement : update.getAddedStatements()) {
        PropertyIdValue pid = statement.getClaim().getMainSnak().getPropertyId();
        Value value = null;
        Snak mainSnak = statement.getClaim().getMainSnak();
        if (mainSnak instanceof ValueSnak) {
            value = ((ValueSnak) mainSnak).getValue();
        }
        Set<Value> values;
        if (value != null) {
            if (propertyIdValueValueMap.containsKey(pid)) {
                values = propertyIdValueValueMap.get(pid);
            } else {
                values = new HashSet<>();
            }
            values.add(value);
            propertyIdValueValueMap.put(pid, values);
        }
    }
    for (PropertyIdValue propertyId : propertyIdValueValueMap.keySet()) {
        List<Statement> statementList = _fetcher.getConstraintsByType(propertyId, conflictsWithConstraintQid);
        for (Statement statement : statementList) {
            ConflictsWithConstraint constraint = new ConflictsWithConstraint(statement);
            PropertyIdValue conflictingPid = constraint.conflictingPid;
            List<Value> itemList = constraint.itemList;
            if (propertyIdValueValueMap.containsKey(conflictingPid) && raiseWarning(propertyIdValueValueMap, conflictingPid, itemList)) {
                QAWarning issue = new QAWarning(type, propertyId.getId() + conflictingPid.getId(), QAWarning.Severity.WARNING, 1);
                issue.setProperty("property_entity", propertyId);
                issue.setProperty("added_property_entity", conflictingPid);
                issue.setProperty("example_entity", update.getEntityId());
                addIssue(issue);
            }
        }
    }
}
Also used : Snak(org.wikidata.wdtk.datamodel.interfaces.Snak) ValueSnak(org.wikidata.wdtk.datamodel.interfaces.ValueSnak) Set(java.util.Set) HashSet(java.util.HashSet) HashMap(java.util.HashMap) Statement(org.wikidata.wdtk.datamodel.interfaces.Statement) PropertyIdValue(org.wikidata.wdtk.datamodel.interfaces.PropertyIdValue) PropertyIdValue(org.wikidata.wdtk.datamodel.interfaces.PropertyIdValue) Value(org.wikidata.wdtk.datamodel.interfaces.Value) ValueSnak(org.wikidata.wdtk.datamodel.interfaces.ValueSnak) QAWarning(org.openrefine.wikidata.qa.QAWarning)

Example 69 with Snak

use of org.wikidata.wdtk.datamodel.interfaces.Snak in project OpenRefine by OpenRefine.

the class InverseConstraintScrutinizer method scrutinize.

@Override
public void scrutinize(Statement statement, EntityIdValue entityId, boolean added) {
    if (!added) {
        // TODO support for deleted statements
        return;
    }
    Snak mainSnak = statement.getClaim().getMainSnak();
    if (!(mainSnak instanceof ValueSnak)) {
        return;
    }
    Value mainSnakValue = ((ValueSnak) mainSnak).getValue();
    if (mainSnakValue instanceof ItemIdValue) {
        PropertyIdValue pid = mainSnak.getPropertyId();
        PropertyIdValue inversePid = getInverseConstraint(pid);
        if (inversePid != null) {
            EntityIdValue targetEntityId = (EntityIdValue) mainSnakValue;
            Set<EntityIdValue> currentValues = _statements.get(pid).get(entityId);
            if (currentValues == null) {
                currentValues = new HashSet<EntityIdValue>();
                _statements.get(pid).put(entityId, currentValues);
            }
            currentValues.add(targetEntityId);
        }
    }
}
Also used : ItemIdValue(org.wikidata.wdtk.datamodel.interfaces.ItemIdValue) PropertyIdValue(org.wikidata.wdtk.datamodel.interfaces.PropertyIdValue) Snak(org.wikidata.wdtk.datamodel.interfaces.Snak) ValueSnak(org.wikidata.wdtk.datamodel.interfaces.ValueSnak) PropertyIdValue(org.wikidata.wdtk.datamodel.interfaces.PropertyIdValue) ItemIdValue(org.wikidata.wdtk.datamodel.interfaces.ItemIdValue) EntityIdValue(org.wikidata.wdtk.datamodel.interfaces.EntityIdValue) Value(org.wikidata.wdtk.datamodel.interfaces.Value) EntityIdValue(org.wikidata.wdtk.datamodel.interfaces.EntityIdValue) ValueSnak(org.wikidata.wdtk.datamodel.interfaces.ValueSnak)

Example 70 with Snak

use of org.wikidata.wdtk.datamodel.interfaces.Snak in project OpenRefine by OpenRefine.

the class QuickStatementsExporter method translateStatement.

protected void translateStatement(String qid, Statement statement, String pid, boolean add, Writer writer) throws IOException {
    Claim claim = statement.getClaim();
    Snak mainSnak = claim.getMainSnak();
    String mainSnakQS = mainSnak.accept(mainSnakPrinter);
    if (!add) {
        // According to: https://www.wikidata.org/wiki/Help:QuickStatements#Removing_statements,
        // Removing statements won't be followed by qualifiers or references.
        writer.write("- ");
        writer.write(qid + mainSnakQS);
        writer.write("\n");
    } else {
        // add statements
        if (statement.getReferences().isEmpty()) {
            writer.write(qid + mainSnakQS);
            for (SnakGroup q : claim.getQualifiers()) {
                translateSnakGroup(q, false, writer);
            }
            writer.write("\n");
        } else {
            // So, to handle multiple references, we can duplicate the statement just with different references.
            for (Reference r : statement.getReferences()) {
                writer.write(qid + mainSnakQS);
                for (SnakGroup q : claim.getQualifiers()) {
                    translateSnakGroup(q, false, writer);
                }
                for (SnakGroup g : r.getSnakGroups()) {
                    translateSnakGroup(g, true, writer);
                }
                writer.write("\n");
            }
        }
    }
}
Also used : Snak(org.wikidata.wdtk.datamodel.interfaces.Snak) Reference(org.wikidata.wdtk.datamodel.interfaces.Reference) SnakGroup(org.wikidata.wdtk.datamodel.interfaces.SnakGroup) Claim(org.wikidata.wdtk.datamodel.interfaces.Claim)

Aggregations

Snak (org.wikidata.wdtk.datamodel.interfaces.Snak)74 Statement (org.wikidata.wdtk.datamodel.interfaces.Statement)58 Test (org.testng.annotations.Test)57 ConstraintFetcher (org.openrefine.wikidata.qa.ConstraintFetcher)51 TermedStatementEntityEdit (org.openrefine.wikidata.updates.TermedStatementEntityEdit)49 TermedStatementEntityEditBuilder (org.openrefine.wikidata.updates.TermedStatementEntityEditBuilder)49 ItemIdValue (org.wikidata.wdtk.datamodel.interfaces.ItemIdValue)48 SnakGroup (org.wikidata.wdtk.datamodel.interfaces.SnakGroup)47 StatementImpl (org.wikidata.wdtk.datamodel.implementation.StatementImpl)43 ValueSnak (org.wikidata.wdtk.datamodel.interfaces.ValueSnak)21 PropertyIdValue (org.wikidata.wdtk.datamodel.interfaces.PropertyIdValue)11 ArrayList (java.util.ArrayList)9 Claim (org.wikidata.wdtk.datamodel.interfaces.Claim)8 Reference (org.wikidata.wdtk.datamodel.interfaces.Reference)7 Value (org.wikidata.wdtk.datamodel.interfaces.Value)7 HashMap (java.util.HashMap)6 QAWarning (org.openrefine.wikidata.qa.QAWarning)6 NoValueSnak (org.wikidata.wdtk.datamodel.interfaces.NoValueSnak)6 List (java.util.List)4 StatementEdit (org.openrefine.wikidata.updates.StatementEdit)4