Skip to content

Commit

Permalink
Cntd. QTL eval.
Browse files Browse the repository at this point in the history
  • Loading branch information
LorenzBuehmann committed Sep 23, 2016
1 parent 1f7968f commit 1c3ed56
Show file tree
Hide file tree
Showing 6 changed files with 270 additions and 50 deletions.
15 changes: 15 additions & 0 deletions components-core/pom.xml
Expand Up @@ -454,6 +454,21 @@
<groupId>org.apache.commons</groupId>
<artifactId>commons-math3</artifactId>
</dependency>

<!-- https://mvnrepository.com/artifact/org.jgrapht/jgrapht-ext -->
<dependency>
<groupId>org.jgrapht</groupId>
<artifactId>jgrapht-ext</artifactId>
<version>0.9.2</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.tinyjee.jgraphx/jgraphx -->
<dependency>
<groupId>org.tinyjee.jgraphx</groupId>
<artifactId>jgraphx</artifactId>
<version>3.4.1.3</version>
</dependency>

<!--
<dependency>
<groupId>org.apache.commons</groupId>
Expand Down
114 changes: 114 additions & 0 deletions components-core/src/main/java/org/dllearner/utilities/QueryUtils.java
Expand Up @@ -21,6 +21,15 @@
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
import com.google.common.collect.Sets;
import com.mxgraph.layout.hierarchical.mxHierarchicalLayout;
import com.mxgraph.layout.mxCircleLayout;
import com.mxgraph.layout.mxOrganicLayout;
import com.mxgraph.swing.mxGraphComponent;
import com.mxgraph.util.mxCellRenderer;
import com.mxgraph.util.mxConstants;
import com.mxgraph.util.png.mxPngEncodeParam;
import com.mxgraph.util.png.mxPngImageEncoder;
import com.mxgraph.view.mxStylesheet;
import org.apache.jena.graph.Node;
import org.apache.jena.graph.Triple;
import org.apache.jena.query.*;
Expand All @@ -31,9 +40,22 @@
import org.apache.jena.vocabulary.RDF;
import org.aksw.jena_sparql_api.core.QueryExecutionFactory;
import org.apache.commons.collections15.ListUtils;
import org.jgraph.JGraph;
import org.jgrapht.DirectedGraph;
import org.jgrapht.ext.JGraphModelAdapter;
import org.jgrapht.ext.JGraphXAdapter;
import org.jgrapht.graph.DefaultDirectedGraph;
import org.jgrapht.graph.DefaultEdge;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.*;
import java.util.Map.Entry;

Expand Down Expand Up @@ -667,6 +689,77 @@ public void filterOutGeneralTypes(QueryExecutionFactory qef, Query query){
triplePatterns.removeAll(triplesPatterns2Remove);
}
}

public static DirectedGraph<Node, LabeledEdge> asJGraphT(Query query) {
QueryUtils utils = new QueryUtils();

Set<Triple> tps = utils.extractTriplePattern(query);

DirectedGraph<Node, LabeledEdge> g = new DefaultDirectedGraph<Node, LabeledEdge>(LabeledEdge.class);

tps.forEach(tp -> {
g.addVertex(tp.getSubject());
g.addVertex(tp.getObject());
g.addEdge(tp.getSubject(), tp.getObject(), new LabeledEdge(tp.getSubject(), tp.getObject(), tp.getPredicate()));
});

return g;
}

public static void exportAsGraph(Query query, File file) {
DirectedGraph<Node, LabeledEdge> g = asJGraphT(query);
System.out.println(g.edgeSet().size());

JGraphXAdapter adapter = new JGraphXAdapter(g);


// positioning via jgraphx layouts
mxHierarchicalLayout layout = new mxHierarchicalLayout(adapter);
layout.execute(adapter.getDefaultParent());

Map<String, Object> edgeStyle = new HashMap<String, Object>();
//edgeStyle.put(mxConstants.STYLE_EDGE, mxConstants.EDGESTYLE_ORTHOGONAL);
edgeStyle.put(mxConstants.STYLE_SHAPE, mxConstants.SHAPE_CONNECTOR);
edgeStyle.put(mxConstants.STYLE_ENDARROW, mxConstants.ARROW_CLASSIC);
edgeStyle.put(mxConstants.STYLE_STROKECOLOR, "#000000");
edgeStyle.put(mxConstants.STYLE_FONTCOLOR, "#000000");
edgeStyle.put(mxConstants.STYLE_LABEL_BACKGROUNDCOLOR, "#ffffff");

Map<String, Object> nodeStyle = new HashMap<>();
nodeStyle.put(mxConstants.STYLE_SHAPE, mxConstants.SHAPE_ELLIPSE);
nodeStyle.put(mxConstants.STYLE_VERTICAL_ALIGN, mxConstants.ALIGN_MIDDLE);

mxStylesheet stylesheet = new mxStylesheet();
stylesheet.setDefaultEdgeStyle(edgeStyle);
stylesheet.setDefaultVertexStyle(nodeStyle);

adapter.setStylesheet(stylesheet);

// JFrame frame = new JFrame();
// frame.getContentPane().add(new mxGraphComponent(adapter));
// frame.pack();
// frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
// frame.setVisible(true);



BufferedImage image = mxCellRenderer.createBufferedImage(adapter, null, 1, Color.WHITE, true, null);
mxPngEncodeParam param = mxPngEncodeParam.getDefaultEncodeParam(image);


try {
FileOutputStream outputStream = new FileOutputStream(file);
mxPngImageEncoder encoder = new mxPngImageEncoder(outputStream, param);
if (image != null) {
encoder.encode(image);
}
outputStream.close();
// ImageIO.write(image, "PNG", file);
} catch (IOException e) {
e.printStackTrace();
}

}

private Set<Node> getSuperClasses(QueryExecutionFactory qef, Node cls){
Set<Node> superClasses = new HashSet<>();
Expand Down Expand Up @@ -778,6 +871,27 @@ public int getFilterCount() {
public ElementGroup getElementGroup(Triple triple){
return triple2Parent.get(triple);
}

static class LabeledEdge extends DefaultEdge {
private final Node s;
private final Node t;
private final Node edge;

public LabeledEdge(Node s, Node t, Node edge) {
this.s = s;
this.t = t;
this.edge = edge;
}

public Node getEdge() {
return edge;
}

@Override
public String toString() {
return edge.toString();
}
}

public static void main(String[] args) throws Exception {
Query q = QueryFactory.create(
Expand Down
Expand Up @@ -34,6 +34,7 @@
import org.apache.jena.query.QueryFactory;
import org.apache.jena.query.ResultSet;
import org.apache.jena.sparql.core.Var;
import org.dllearner.utilities.QueryUtils;

/**
* @author Lorenz Buehmann
Expand Down Expand Up @@ -98,7 +99,10 @@ public class BenchmarkDescriptionGeneratorHTML {
+ "table {\n" +
" border-collapse: separate;\n" +
" border-spacing: 0 5px;\n" +
"}\n" +
"}\n" +
"table th {\n" +
" width: auto !important;\n" +
"}" +
"\n" +
"thead th {\n" +
" background-color: #006DCC;\n" +
Expand Down Expand Up @@ -165,37 +169,53 @@ public void generateBenchmarkDescription(File benchmarkQueriesFile, File htmlOut
html += "<thead><tr>"
+ "<th data-sortable=\"true\" data-valign='middle'>ID</th>"
+ "<th data-sortable=\"true\" data-valign='middle'>Query</th>"
+ "<th data-sortable=\"true\" data-valign='middle'>Query Type</th>"
+ "<th data-align=\"right\" data-sortable=\"true\" data-valign='middle'>Depth</th>"
+ "<th data-align=\"right\" data-sortable=\"true\" data-valign='middle'>#Instances</th>"
+ "</tr></thead>\n";

html += "<tbody>\n";
int id = 1;
for (Query query : queries) {
query.getPrefixMapping().removeNsPrefix("owl");
query.getPrefixMapping().removeNsPrefix("rdfs");
query.getPrefixMapping().removeNsPrefix("foaf");
query.getPrefixMapping().removeNsPrefix("rdf");

if(query.toString().contains("http://dbpedia.org/ontology/")) {
query.getPrefixMapping().setNsPrefix("dbo", "http://dbpedia.org/ontology/");
}
if(query.toString().contains("http://dbpedia.org/property/")) {
query.getPrefixMapping().setNsPrefix("dbp", "http://dbpedia.org/property/");
}
if(query.toString().contains("http://xmlns.com/foaf/0.1/")) {
query.getPrefixMapping().setNsPrefix("foaf", "http://xmlns.com/foaf/0.1/");
}
QueryUtils.exportAsGraph(query, new File("/tmp/test.png"));


query.setBaseURI("http://dbpedia.org/resource/");
html += "<tr>\n";

// 1. column: ID
html += "<td>" + id++ + "</td>\n";

// 2. column: SPARQL query
html += "<td><pre>" + query.toString().replace("<", "&lt;").replace(">", "&gt;") + "</pre></td>\n";

// 3. column: SPARQL query type
html += "<td>" + SPARQLUtils.getQueryType(query) + "</td>\n";

// 3. column: depth
// 4. column: depth
int depth = org.dllearner.utilities.QueryUtils.getSubjectObjectJoinDepth(query, var) + 1;
html += "<td class='number'>" + depth + "</td>\n";

// 4. column: #instances
int nrOfInstances = 0;
QueryExecution qe = qef.createQueryExecution(query);
ResultSet rs = qe.execSelect();
while(rs.hasNext()) {
rs.next();
nrOfInstances++;
}
qe.close();
// 5. column: #instances
int nrOfInstances = SPARQLUtils.getResult(qef, query).size();
html += "<td class='number'>" + nrOfInstances + "</td>\n";

html += "</tr>\n";
break;
}
html += "</tbody>\n";
html += "</table>\n";
Expand All @@ -210,14 +230,16 @@ public void generateBenchmarkDescription(File benchmarkQueriesFile, File htmlOut
}

public static void main(String[] args) throws Exception{
if(args.length < 4) {
if(args.length < 3) {
System.out.println("Usage: BenchmarkDescriptionGeneratorHTML <source> <target> <endpointURL> <defaultGraphURI>");
System.exit(0);
}
File source = new File(args[0]);
File target = new File(args[1]);
String endpointURL = args[2];
String defaultGraph = args[3];
String defaultGraph = null;
if(args.length == 4)
defaultGraph = args[3];

QueryExecutionFactory qef = new QueryExecutionFactoryHttp(endpointURL, defaultGraph);
qef = new QueryExecutionFactoryPaginated(qef);
Expand Down
Expand Up @@ -18,9 +18,11 @@
*/
package org.dllearner.algorithms.qtl.experiments;

import com.google.common.base.Joiner;
import com.jamonapi.Monitor;
import com.jamonapi.MonitorFactory;
import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;
import org.apache.jena.graph.Triple;
import org.apache.jena.query.QueryFactory;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.Statement;
Expand All @@ -29,10 +31,15 @@
import org.dllearner.kb.SparqlEndpointKS;
import org.dllearner.kb.sparql.ConciseBoundedDescriptionGenerator;
import org.dllearner.kb.sparql.SymmetricConciseBoundedDescriptionGeneratorImpl;
import org.dllearner.utilities.QueryUtils;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.function.Predicate;
import java.util.stream.Collectors;

Expand Down Expand Up @@ -88,48 +95,62 @@ public List<Predicate<Statement>> getQueryTreeFilters() {
return queryTreeFilters;
}

/**
* Writes the SPARQL queries line-wise to file.
*
* @param file the file
*/
public void saveToDisk(File file) throws IOException {
Files.write(file.toPath(), sparqlQueries.stream().map(q -> q.replace("\n", " ")).collect(Collectors.toList()));
}

public void analyze() {
ConciseBoundedDescriptionGenerator cbdGen = new SymmetricConciseBoundedDescriptionGeneratorImpl(ks.getQueryExecutionFactory());

String s = sparqlQueries.stream().map(QueryFactory::create).map(q -> {
String tsv = sparqlQueries.stream().map(QueryFactory::create).map(q -> {
StringBuilder sb = new StringBuilder();
sb.append(q.toString().replace("\n", " ")).append("\t");
sb.append(q.toString().replace("\n", " "));
try {
// get query result
List<String> result = SPARQLUtils.getResult(ks.getQueryExecutionFactory(), q);
sb.append(result.size());

// check CBD sizes and time
Monitor mon = MonitorFactory.getTimeMonitor("CBD");
mon.reset();
DescriptiveStatistics sizeStats = new DescriptiveStatistics();
result.stream()
.map(r -> {
System.out.println(r);
mon.start();
Model cbd = cbdGen.getConciseBoundedDescription(r, 2);
mon.stop();
return cbd;
})
.map(Model::size)
.forEach(sizeStats::addValue);

// show min., max. and avg. size
sb.append("\t").append(sizeStats.getMin());
sb.append("\t").append(sizeStats.getMax());
sb.append("\t").append(sizeStats.getMean());

// show min., max. and avg. CBD time
sb.append("\t").append(mon.getTotal());
sb.append("\t").append(mon.getMin());
sb.append("\t").append(mon.getMax());
sb.append("\t").append(mon.getAvg());
sb.append("\t").append(result.size());

// query type
SPARQLUtils.QueryType queryType = SPARQLUtils.getQueryType(q);
sb.append("\t").append(queryType.name());


// // check CBD sizes and time
// Monitor mon = MonitorFactory.getTimeMonitor("CBD");
// mon.reset();
// DescriptiveStatistics sizeStats = new DescriptiveStatistics();
// result.stream()
// .map(r -> {
// System.out.println(r);
// mon.start();
// Model cbd = cbdGen.getConciseBoundedDescription(r, 2);
// mon.stop();
// return cbd;
// })
// .map(Model::size)
// .forEach(sizeStats::addValue);
//
// // show min., max. and avg. size
// sb.append("\t").append(sizeStats.getMin());
// sb.append("\t").append(sizeStats.getMax());
// sb.append("\t").append(sizeStats.getMean());
//
// // show min., max. and avg. CBD time
// sb.append("\t").append(mon.getTotal());
// sb.append("\t").append(mon.getMin());
// sb.append("\t").append(mon.getMax());
// sb.append("\t").append(mon.getAvg());
} catch (Exception e) {
e.printStackTrace();
}
return sb;
}).collect(Collectors.joining("\n"));

System.out.println(s);
System.out.println(tsv);
}
}

0 comments on commit 1c3ed56

Please sign in to comment.