package at.ac.univie.mminf.qskos4j.issues.relations; import at.ac.univie.mminf.qskos4j.issues.Issue; import at.ac.univie.mminf.qskos4j.issues.concepts.AuthoritativeConcepts; import at.ac.univie.mminf.qskos4j.progress.MonitoredIterator; import at.ac.univie.mminf.qskos4j.result.CollectionResult; import at.ac.univie.mminf.qskos4j.util.vocab.SparqlPrefix; import org.openrdf.OpenRDFException; import org.openrdf.model.Resource; import org.openrdf.model.Statement; import org.openrdf.model.URI; import org.openrdf.model.impl.StatementImpl; import org.openrdf.model.impl.URIImpl; import org.openrdf.query.QueryLanguage; import org.openrdf.repository.RepositoryResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; public class ReflexivelyRelatedConcepts extends Issue<CollectionResult<Statement>> { private final Logger logger = LoggerFactory.getLogger(ReflexivelyRelatedConcepts.class); private AuthoritativeConcepts authoritativeConcepts; public ReflexivelyRelatedConcepts(AuthoritativeConcepts authoritativeConcepts) { super(authoritativeConcepts, "rrc", "Reflexively Related Concepts", "Finds concepts that are related to themselves", IssueType.ANALYTICAL, new URIImpl("https://github.com/cmader/qSKOS/wiki/Quality-Issues#wiki-Reflexive_Relations")); this.authoritativeConcepts = authoritativeConcepts; } @Override protected CollectionResult<Statement> invoke() throws OpenRDFException { return new CollectionResult<>(findReflexivelyRelatedResources()); } private Collection<Statement> findReflexivelyRelatedResources() throws OpenRDFException { Collection<Statement> results = new ArrayList<>(); Iterator<Resource> conceptIt = new MonitoredIterator<>(authoritativeConcepts.getResult().getData(), progressMonitor); while (conceptIt.hasNext()) { Resource concept = conceptIt.next(); if (concept instanceof URI && isReflexivelyRelated((URI) concept)) { RepositoryResult<Statement> reflexiveProperties = repCon.getStatements(concept, null, concept, false); while (reflexiveProperties.hasNext()) { results.add(new StatementImpl(concept, reflexiveProperties.next().getPredicate(), concept)); } } } return results; } private boolean isReflexivelyRelated(URI resource) { try { return repCon.prepareBooleanQuery(QueryLanguage.SPARQL, SparqlPrefix.SKOS + " " + SparqlPrefix.RDFS + "ASK {" + "<" + resource.stringValue() + "> ?relation <" + resource.stringValue() + "> . " + "?relation rdfs:subPropertyOf skos:semanticRelation " + "}").evaluate(); } catch (OpenRDFException e) { logger.error("Error finding relations of concept '" +resource+ "'"); } return false; } }