@@ -2,6 +2,7 @@ package net.sansa_stack.inference.rules
22
33import java .util .stream .Collectors
44
5+ import scala .collection
56import scala .collection .JavaConverters ._
67import scala .language .{existentials , implicitConversions }
78import scalax .collection .GraphPredef ._
@@ -10,8 +11,10 @@ import scalax.collection._
1011import scalax .collection .edge .Implicits ._
1112import scalax .collection .edge ._
1213import scalax .collection .mutable .DefaultGraphImpl
14+ import scalax .collection .GraphPredef ._
15+ import scalax .collection .GraphEdge ._
1316
14- import org .apache .jena .graph .Node
17+ import org .apache .jena .graph .{ Node , NodeFactory }
1518import org .apache .jena .reasoner .TriplePattern
1619import org .apache .jena .reasoner .rulesys .Rule
1720import org .apache .jena .vocabulary .RDFS
@@ -21,6 +24,8 @@ import org.jgrapht.alg.cycle.TarjanSimpleCycles
2124import net .sansa_stack .inference .utils .RuleUtils ._
2225import net .sansa_stack .inference .utils .graph .LabeledEdge
2326import net .sansa_stack .inference .utils .{GraphUtils , Logging , RuleUtils }
27+ import collection .mutable .{ArrayBuffer , Buffer }
28+ import scala .collection .mutable .HashMap
2429
2530/**
2631 * A generator for a so-called dependency graph based on a given set of rules.
@@ -228,7 +233,71 @@ object RuleDependencyGraphGenerator extends Logging {
228233 val cycles = cycleDetector.findCyclesContainingVertex(node.value)
229234 debug(cycles.asScala.mkString(" ," ))
230235
231- debug(allCycles.asScala.filter(cycle => cycle.contains(node.value)).map(cycle => cycle.asScala.map(rule => rule.getName)).mkString(" \n " ))
236+ // cycles that contain the current node
237+ val cyclesWithNode : Buffer [Buffer [Rule ]] = allCycles.asScala.filter(cycle => cycle.contains(node.value)).map(cycle => cycle.asScala)
238+
239+ // cycles that use the same property
240+ val cyclesWithNodeSameProp = cyclesWithNode.map(cycle => {
241+
242+ debug(" Cycle: " + cycle.mkString(" , " ))
243+ var pairsOfRules = cycle zip cycle.tail
244+ pairsOfRules :+= (cycle.last, cycle(0 ))
245+
246+ val edges = pairsOfRules.map(e => {
247+ val node1 = graph get e._1
248+ val node2 = graph get e._2
249+
250+ node1.outgoing.filter(_.target == node2)
251+ }).flatten
252+ debug(" Edges: " + edges.mkString(" , " ))
253+
254+ var predicates = edges.map(_.label.asInstanceOf [TriplePattern ].getPredicate)
255+ if (predicates.forall(_.isVariable)) predicates = ArrayBuffer (NodeFactory .createVariable(" p" ))
256+ debug(" predicates:" + predicates)
257+ val samePred = predicates.size == 1
258+ if (samePred) Some (predicates(0 ), edges) else None
259+ }).filter(_.isDefined).map(_.get).groupBy(e => e._1).mapValues(e => e.map(x => x._2).toList)
260+
261+ val tmp : Map [Node , Map [Int , List [Buffer [graph.EdgeT ]]]] = cyclesWithNodeSameProp.mapValues(value => value.map(cycle => (cycle.size, cycle)).groupBy(_._1).mapValues(e => e.map(x => x._2).toList))
262+
263+ tmp.foreach(predicate2Cycles => {
264+ debug(" predicate: " + predicate2Cycles._1)
265+ predicate2Cycles._2.foreach(entry => {
266+ debug(s " length ${entry._1}" )
267+ val prop2Cycle = entry._2
268+ var pairsOfCycles = prop2Cycle zip prop2Cycle.tail
269+ pairsOfCycles.foreach(pair => {
270+ debug(pair._1.map(_.source) + " ???? " + pair._2.map(_.source))
271+
272+ if (pair._1.map(_.source).toSet == pair._2.map(_.source).toSet) {
273+ debug(" redundant cycle " + pair._1.map(_.source.value.getName))
274+ }
275+ })
276+ })
277+ })
278+ // check for cycles over the same nodes via the same predicate in multiple directions
279+ // val grouped = cyclesWithNodeSameProp.groupBy(_._2)
280+ // grouped.foreach(e => {
281+ // debug(s"length ${e._1}")
282+ // val predicate2Cycles = e._2
283+ //
284+ // predicate2Cycles.foreach(predicate2CyclesEntry => {
285+ // val prop2Cycle = predicate2CyclesEntry._2
286+ // var pairsOfCycles = prop2Cycle zip prop2Cycle.tail
287+ // pairsOfCycles.foreach(pair => {
288+ // debug(pair._1.map(_.source) + " ???? " + pair._2.map(_.source))
289+ //
290+ // if(pair._1.map(_.source) == pair._2.map(_.source)) {
291+ // debug("redundant cycle " + pair._1.map(_.source.value.getName))
292+ // }
293+ // })
294+ // })
295+ //
296+ //
297+ // })
298+
299+ // debug(cyclesWithNodeSameProp.map(prop2Cycle =>
300+ // s"${prop2Cycle._1} => ${prop2Cycle._2.map(edge => (edge.source.value.getName, edge.target.value.getName))}").mkString("\n"))
232301
233302 })
234303
0 commit comments