package at.ac.univie.mminf.qskos4j.issues.skosintegrity; import at.ac.univie.mminf.qskos4j.issues.Issue; import at.ac.univie.mminf.qskos4j.result.CollectionResult; import at.ac.univie.mminf.qskos4j.util.Tuple; import at.ac.univie.mminf.qskos4j.util.TupleQueryResultUtil; import at.ac.univie.mminf.qskos4j.util.vocab.SparqlPrefix; import org.openrdf.OpenRDFException; import org.openrdf.model.Resource; import org.openrdf.model.impl.URIImpl; import org.openrdf.query.QueryLanguage; import org.openrdf.query.TupleQuery; import java.util.Collection; import java.util.HashSet; /** * Finds <a href="https://github.com/cmader/qSKOS/wiki/Quality-Issues#wiki-Mapping_Clashes">Exact vs. Associative and Hierarchical Mapping Clashes</a>. */ public class MappingClashes extends Issue<CollectionResult<Tuple<Resource>>> { public MappingClashes() { super("mc", "Mapping Clashes", "Covers condition S46 from the SKOS reference document (Exact vs. Associative and Hierarchical Mapping Clashes)", IssueType.ANALYTICAL, new URIImpl("https://github.com/cmader/qSKOS/wiki/Quality-Issues#mapping-clashes") ); } @Override protected CollectionResult<Tuple<Resource>> invoke() throws OpenRDFException { TupleQuery query = repCon.prepareTupleQuery(QueryLanguage.SPARQL, createExVsAssMappingQuery()); Collection<Tuple<Resource>> valuePairs = TupleQueryResultUtil.createCollectionOfResourcePairs( query.evaluate(), "concept1", "concept2"); Collection<Tuple<Resource>> distinctPairs = new HashSet<Tuple<Resource>>(); distinctPairs.addAll(valuePairs); return new CollectionResult<Tuple<Resource>>(distinctPairs); } private String createExVsAssMappingQuery() { return SparqlPrefix.SKOS + "SELECT ?concept1 ?concept2 WHERE {" + "?concept1 (skos:exactMatch|^skos:exactMatch)+ ?concept2 ."+ "?concept1 skos:broadMatch|skos:narrowMatch|skos:relatedMatch ?concept2 ." + "}"; } }