package at.ac.univie.mminf.qskos4j.issues.labels; import at.ac.univie.mminf.qskos4j.issues.Issue; import at.ac.univie.mminf.qskos4j.issues.labels.util.LabelConflict; import at.ac.univie.mminf.qskos4j.issues.labels.util.LabelType; import at.ac.univie.mminf.qskos4j.issues.labels.util.LabeledConcept; import at.ac.univie.mminf.qskos4j.issues.labels.util.ResourceLabelsCollector; import at.ac.univie.mminf.qskos4j.issues.labels.util.LabelConflictsResult; import org.openrdf.OpenRDFException; import org.openrdf.model.Value; import org.openrdf.model.impl.URIImpl; import org.openrdf.repository.RepositoryConnection; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Map; /** * * Finds concepts with more than one preferred label ( * <a href="https://github.com/cmader/qSKOS/wiki/Quality-Issues#wiki-Inconsistent_Preferred_Labels">Inconsistent Preferred Labels</a> */ public class InconsistentPrefLabels extends Issue<LabelConflictsResult> { private Map<Value, LabelConflict> ambigPrefLabels; private ResourceLabelsCollector resourceLabelsCollector; public InconsistentPrefLabels(ResourceLabelsCollector resourceLabelsCollector) { super("ipl", "Inconsistent Preferred Labels", "Finds resources with more then one prefLabel per language", IssueType.ANALYTICAL, new URIImpl("https://github.com/cmader/qSKOS/wiki/Quality-Issues#inconsistent-preferred-labels")); this.resourceLabelsCollector = resourceLabelsCollector; } @Override protected LabelConflictsResult invoke() throws OpenRDFException { Map<Value, Collection<LabeledConcept>> prefLabelsByUri = orderPrefLabelsByResource(); extractPrefLabelConflicts(prefLabelsByUri); return new LabelConflictsResult(ambigPrefLabels.values()); } private Map<Value, Collection<LabeledConcept>> orderPrefLabelsByResource() throws OpenRDFException { Map<Value, Collection<LabeledConcept>> prefLabelsByResource = new HashMap<Value, Collection<LabeledConcept>>(); for (LabeledConcept labeledConcept : resourceLabelsCollector.getLabeledConcepts()) { if (labeledConcept.getLabelType() != LabelType.PREF_LABEL) continue; Collection<LabeledConcept> labeledResourcesOfUri = prefLabelsByResource.get(labeledConcept.getConcept()); if (labeledResourcesOfUri == null) { labeledResourcesOfUri = new ArrayList<LabeledConcept>(); prefLabelsByResource.put(labeledConcept.getConcept(), labeledResourcesOfUri); } labeledResourcesOfUri.add(labeledConcept); } return prefLabelsByResource; } private void extractPrefLabelConflicts(Map<Value, Collection<LabeledConcept>> prefLabelsByResource) { ambigPrefLabels = new HashMap<Value, LabelConflict>(); for (Map.Entry<Value, Collection<LabeledConcept>> entry : prefLabelsByResource.entrySet()) { LabelConflict labelConflict = findPrefLabelConflict(entry.getValue()); if (labelConflict != null) { ambigPrefLabels.put(entry.getKey(), labelConflict); } } } private LabelConflict findPrefLabelConflict(Collection<LabeledConcept> labeledResources) { LabelConflict labelConflict = null; for (LabeledConcept labeledResource : labeledResources) { for (LabeledConcept otherLabeledResource : labeledResources) { if (hasPrefLabelConflict(labeledResource, otherLabeledResource)) { if (labelConflict == null) labelConflict = new LabelConflict(); labelConflict.add(labeledResource); labelConflict.add(otherLabeledResource); } } } return labelConflict; } private boolean hasPrefLabelConflict(LabeledConcept resource1, LabeledConcept resource2) { if (resource1 != resource2) { String langRes1 = resource1.getLiteral().getLanguage(); String langRes2 = resource2.getLiteral().getLanguage(); if (langRes1 != null && langRes2 != null) { return langRes1.equals(langRes2); } else if (langRes1 == null && langRes2 == null) { return true; } } return false; } @Override public void setRepositoryConnection(RepositoryConnection repCon) { resourceLabelsCollector.setRepositoryConnection(repCon); super.setRepositoryConnection(repCon); } }