Skip to content
This repository was archived by the owner on Oct 8, 2020. It is now read-only.

Commit 2dbef38

Browse files
RDG cycles of different length rule.
1 parent 6b0b9be commit 2dbef38

1 file changed

Lines changed: 71 additions & 2 deletions

File tree

sansa-inference-common/src/main/scala/net/sansa_stack/inference/rules/RuleDependencyGraphGenerator.scala

Lines changed: 71 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package net.sansa_stack.inference.rules
22

33
import java.util.stream.Collectors
44

5+
import scala.collection
56
import scala.collection.JavaConverters._
67
import scala.language.{existentials, implicitConversions}
78
import scalax.collection.GraphPredef._
@@ -10,8 +11,10 @@ import scalax.collection._
1011
import scalax.collection.edge.Implicits._
1112
import scalax.collection.edge._
1213
import 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}
1518
import org.apache.jena.reasoner.TriplePattern
1619
import org.apache.jena.reasoner.rulesys.Rule
1720
import org.apache.jena.vocabulary.RDFS
@@ -21,6 +24,8 @@ import org.jgrapht.alg.cycle.TarjanSimpleCycles
2124
import net.sansa_stack.inference.utils.RuleUtils._
2225
import net.sansa_stack.inference.utils.graph.LabeledEdge
2326
import 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

Comments
 (0)