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

Commit c3fc241

Browse files
Extended rule depenendency graph eval script class.
* added CLI support * add rule string to GraphML export as separate attribute
1 parent 6528476 commit c3fc241

File tree

3 files changed

+104
-23
lines changed

3 files changed

+104
-23
lines changed

sansa-inference-common/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,11 @@
8383
<version>3.5.0</version>
8484
</dependency>
8585

86+
<!-- Scopt CLI API-->
87+
<dependency>
88+
<groupId>com.github.scopt</groupId>
89+
<artifactId>scopt_${scala.binary.version}</artifactId>
90+
</dependency>
8691

8792
<!-- Test -->
8893
<dependency>

sansa-inference-common/src/main/scala/net/sansa_stack/inference/utils/GraphUtils.scala

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package net.sansa_stack.inference.utils
22

33
import java.io.{ByteArrayOutputStream, File, FileOutputStream, FileWriter}
4+
import java.util
45

5-
import scalax.collection.edge.LDiEdge
66
import com.itextpdf.text.PageSize
77
import org.apache.jena.graph.Node
88
import org.apache.jena.reasoner.TriplePattern
@@ -19,13 +19,15 @@ import org.gephi.layout.plugin.force.yifanHu.YifanHuLayout
1919
import org.gephi.preview.api.{Item, PreviewController, PreviewProperty}
2020
import org.gephi.preview.types.EdgeColor
2121
import org.gephi.project.api.ProjectController
22-
import org.jgrapht.{DirectedGraph, Graph}
22+
import org.jgrapht.Graph
2323
import org.jgrapht.alg.isomorphism.VF2GraphIsomorphismInspector
24+
import org.jgrapht.graph.{DefaultDirectedGraph, DirectedPseudograph}
25+
import org.jgrapht.io.GraphMLExporter.AttributeCategory
26+
import org.jgrapht.io._
2427
import org.openide.util.Lookup
28+
import scalax.collection.edge.LDiEdge
2529

26-
import net.sansa_stack.inference.utils.graph.{EdgeEquivalenceComparator, LabeledEdge, NodeEquivalenceComparator}
27-
import org.jgrapht.graph.{DefaultDirectedGraph, DirectedPseudograph}
28-
import org.jgrapht.io.{ComponentNameProvider, GraphMLExporter, IntegerComponentNameProvider};
30+
import net.sansa_stack.inference.utils.graph.{EdgeEquivalenceComparator, LabeledEdge, NodeEquivalenceComparator};
2931

3032
/**
3133
* @author Lorenz Buehmann
@@ -144,18 +146,38 @@ object GraphUtils {
144146
}
145147

146148
val edgeLabelProvider = new ComponentNameProvider[LabeledEdge[Rule, TriplePattern]]() {
147-
override def getName(e: LabeledEdge[Rule, TriplePattern]): String =
148-
FmtUtils.stringForNode(e.label.getPredicate, prefixMapping)
149+
override def getName(e: LabeledEdge[Rule, TriplePattern]): String = {
150+
val p = e.label.getPredicate
151+
// omit if predicate is a variable
152+
if(p.isVariable) {
153+
""
154+
} else {
155+
FmtUtils.stringForNode(e.label.getPredicate, prefixMapping)
156+
}
157+
}
149158
}
150159

151-
// val exporter = new GraphMLExporter[String,LabeledEdge](
160+
import org.jgrapht.io.DefaultAttribute
161+
val ruleDescriptionProvider = new ComponentAttributeProvider[Rule]() {
162+
override def getComponentAttributes(r: Rule): util.Map[String, Attribute] = {
163+
val map = new util.HashMap[String, Attribute]()
164+
map.put("rule", DefaultAttribute.createAttribute(r.toString))
165+
map
166+
}
167+
}
168+
169+
// val exporter = new GraphMLExporter[String,LabeledEdge](
152170
// vertexIDProvider, vertexNameProvider, edgeIDProvider,edgeLabelProvider)
153171

154172
val exporter = new GraphMLExporter[Rule, LabeledEdge[Rule, TriplePattern]](
155173
new IntegerComponentNameProvider[Rule],
156174
vertexNameProvider,
175+
ruleDescriptionProvider,
157176
new IntegerComponentNameProvider[LabeledEdge[Rule, TriplePattern]],
158-
edgeLabelProvider)
177+
edgeLabelProvider,
178+
null)
179+
180+
exporter.registerAttribute("rule", AttributeCategory.NODE, AttributeType.STRING)
159181

160182
val fw = new FileWriter(filename)
161183

sansa-inference-common/src/test/scala/net/sansa_stack/inference/common/DependencyGraphTest.scala

Lines changed: 68 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,95 @@
11
package net.sansa_stack.inference.common
22

3+
import java.nio.file.{Path, Paths}
4+
35
import net.sansa_stack.inference.rules._
46
import net.sansa_stack.inference.rules.minimizer.DefaultRuleDependencyGraphMinimizer
57
import net.sansa_stack.inference.utils.GraphUtils._
68
import net.sansa_stack.inference.utils.RuleUtils
79

810
/**
11+
* Computes a given set of rules and exports its rule dependency graph before and after minimization.
12+
*
13+
*
914
* @author Lorenz Buehmann
1015
*/
1116
object DependencyGraphTest {
1217

18+
// the config object
19+
case class Config(in: Path = null,
20+
out: Path = null,
21+
profile: String = "",
22+
ruleNames: Seq[String] = Seq()
23+
)
24+
25+
implicit val pathRead: scopt.Read[Path] =
26+
scopt.Read.reads(Paths.get(_))
27+
28+
// the CLI parser
29+
val parser = new scopt.OptionParser[Config]("DependencyGraphTest") {
30+
31+
head("DependencyGraphTest", "0.1.0")
32+
33+
opt[Path]('i', "input").required().valueName("<path>").
34+
action((x, c) => c.copy(in = x)).
35+
text("path to file containing the rules")
36+
37+
opt[Path]('o', "out").required().valueName("<directory>").
38+
action((x, c) => c.copy(out = x)).
39+
text("the output directory")
40+
41+
opt[String]('p', "profile").required().valueName("<profile name>").
42+
action((x, c) => c.copy(profile = x)).
43+
text("the name of the set of rules to process - will be used for output files")
44+
45+
opt[Seq[String]]("rules").optional().valueName("<ruleName1>,<ruleName2>,...").
46+
action((x, c) => {
47+
c.copy(ruleNames = x)
48+
}).
49+
text("list of rule names to process just a subset of the rules contained in the given input file")
50+
}
51+
1352
def main(args: Array[String]): Unit = {
1453

15-
val path = "/tmp"
54+
parser.parse(args, Config()) match {
55+
case Some(config) =>
56+
run(config)
57+
case None =>
58+
// scalastyle:off println
59+
println(parser.usage)
60+
// scalastyle:on println
61+
}
62+
}
63+
64+
def run(config: Config): Unit = {
65+
66+
// make output dirs
67+
config.out.toFile.mkdirs()
68+
69+
// load the rules
70+
var rules = RuleUtils.load(config.in.toAbsolutePath.toString)
71+
72+
// filter if necessary
73+
if(config.ruleNames.nonEmpty) {
74+
rules = rules.filter(r => config.ruleNames.contains(r.getName))
75+
}
1676

1777
// val names = Seq("rdfp13a", "rdfp13b", "rdfp13c", "rdfs5", "rdfs7") // property rules
18-
val names = Seq("rdfp13a", "rdfp13b", "rdfp13c", "rdfs5", "rdfs7", "rdfp3", "rdfp4") // property rules + some instance rules
78+
val names = Seq("rdfp13a", "rdfp13b", "rdfp13c")//, "rdfs5", "rdfs7", "rdfp3", "rdfp4") // property rules + some instance rules
1979
// val names = Seq("rdfs5", "rdfs7", "rdfp3", "rdfp4") // property TC rule + some instance rules
2080

21-
// define the rules
22-
val rules = RuleSets.OWL_HORST.filter(r => names.contains(r.getName))
23-
val profile = ReasoningProfile.OWL_HORST
24-
// val rules = RuleSets.RDFS_SIMPLE
25-
// val profile = ReasoningProfile.RDFS_SIMPLE
26-
2781
val minimizer = new DefaultRuleDependencyGraphMinimizer()
2882

29-
// export graphs
30-
rules.foreach(rule => RuleUtils.asGraph(rule).export(s"${path}/rule-${rule.getName}.graphml"))
83+
// export graphs for each rule
84+
rules.foreach(rule => RuleUtils.asGraph(rule).export(config.out.resolve(s"rule_${rule.getName}.graphml").toAbsolutePath.toString))
3185

3286
// generate the rule dependency graph
33-
var dependencyGraph = RuleDependencyGraphGenerator.generate(rules)
34-
dependencyGraph.export(s"${path}/rdg-${profile}.graphml", true)
87+
var dependencyGraph = RuleDependencyGraphGenerator.generate(rules.toSet)
88+
dependencyGraph.export(config.out.resolve(s"rdg_${config.profile}.graphml").toAbsolutePath.toString, showInFlowDirection = true)
3589

90+
// generate the minimized graph
3691
dependencyGraph = minimizer.execute(dependencyGraph) // RuleDependencyGraphGenerator.generate(rules, pruned = true)
37-
dependencyGraph.export(s"${path}/rdg-${profile}-pruned.graphml", true)
38-
// dependencyGraph.exportAsPDF(s"${path}/rdg-${profile}-pruned.pdf")
92+
dependencyGraph.export(config.out.resolve(s"rdg_${config.profile}_minimized.graphml").toAbsolutePath.toString, showInFlowDirection = true)
3993

4094
// generate the high-level dependency graph
4195
val highLevelDependencyGraph = HighLevelRuleDependencyGraphGenerator.generate(dependencyGraph)

0 commit comments

Comments
 (0)