package at.ac.univie.mminf.qskos4j.issues.skosintegrity; import at.ac.univie.mminf.qskos4j.issues.HierarchyGraphBuilder; import at.ac.univie.mminf.qskos4j.issues.Issue; import at.ac.univie.mminf.qskos4j.progress.MonitoredIterator; import at.ac.univie.mminf.qskos4j.result.CollectionResult; import at.ac.univie.mminf.qskos4j.util.Pair; import at.ac.univie.mminf.qskos4j.util.graph.NamedEdge; import org.jgrapht.DirectedGraph; import org.jgrapht.alg.DijkstraShortestPath; import org.openrdf.OpenRDFException; import org.openrdf.model.Resource; import org.openrdf.model.impl.URIImpl; import org.openrdf.repository.RepositoryConnection; import java.util.*; public class HierarchicalRedundancy extends Issue<CollectionResult<Pair<Resource>>> { private Collection<Pair<Resource>> hierarchicalRedundancies; private HierarchyGraphBuilder hierarchyGraphBuilder; private DirectedGraph<Resource, NamedEdge> hierarchyGraph; public HierarchicalRedundancy(HierarchyGraphBuilder hierarchyGraphBuilder) { super("hr", "Hierarchical Redundancy", "Finds broader/narrower relations over multiple hierarchy levels", IssueType.ANALYTICAL, new URIImpl("https://github.com/cmader/qSKOS/wiki/Quality-Issues#hierarchical-redundancy")); this.hierarchyGraphBuilder = hierarchyGraphBuilder; } @Override protected CollectionResult<Pair<Resource>> invoke() throws OpenRDFException { hierarchicalRedundancies = new HashSet<>(); hierarchyGraph = hierarchyGraphBuilder.createGraph(); Set<NamedEdge> allEdges = new HashSet<>(hierarchyGraph.edgeSet()); Iterator<NamedEdge> it = new MonitoredIterator<>(allEdges, progressMonitor); while (it.hasNext()) { NamedEdge edge = it.next(); Resource source = hierarchyGraph.getEdgeSource(edge); Resource target = hierarchyGraph.getEdgeTarget(edge); hierarchyGraph.removeEdge(edge); List<NamedEdge> path = new DijkstraShortestPath<>(hierarchyGraph, source, target).getPathEdgeList(); if (path != null && !path.isEmpty()) { hierarchicalRedundancies.add(new Pair<>(source, target)); } hierarchyGraph.addEdge(source, target); } return new CollectionResult<>(hierarchicalRedundancies); } @Override public void setRepositoryConnection(RepositoryConnection repCon) { hierarchyGraphBuilder.setRepositoryConnection(repCon); super.setRepositoryConnection(repCon); } }