Skip to content

Commit

Permalink
Cured bit rot in the query containment module
Browse files Browse the repository at this point in the history
  • Loading branch information
Aklakan committed Feb 12, 2019
1 parent 2e45edf commit 20a0487
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 25 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import com.codepoetics.protonpack.functions.TriFunction;

public interface NodeMapper<A, B, M, C, V>
extends TriFunction<A, B, TreeMapping<A, B, M, V>, Entry<C, V>>
// extends TriFunction<A, B, TreeMapping<A, B, M, V>, Entry<C, V>>
{

Entry<C, V> apply(A a, B b, TreeMapping<A, B, M, V> treeMapping);
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.aksw.jena_sparql_api.jgrapht;
package org.aksw.commons.graph.index.jena;

import java.io.File;
import java.io.FileInputStream;
Expand All @@ -18,25 +18,24 @@
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.function.BiFunction;
import java.util.stream.Collectors;

import javax.persistence.criteria.Root;

import org.aksw.commons.collections.tagmap.TagMapSetTrie;
import org.aksw.commons.collections.tagmap.ValidationUtils;
import org.aksw.commons.graph.index.core.SubgraphIsomorphismIndex;
import org.aksw.commons.graph.index.jena.SubgraphIsomorphismIndexJena;
import org.aksw.jena_sparql_api.core.SparqlService;
import org.aksw.jena_sparql_api.mapper.jpa.core.RdfEntityManager;
import org.aksw.jena_sparql_api.mapper.jpa.core.SparqlEntityManagerFactory;
import org.aksw.jena_sparql_api.mapper.util.JpaUtils;
import org.aksw.jena_sparql_api.query_containment.index.NodeMapperOp;
import org.aksw.jena_sparql_api.query_containment.index.NodeMapperOpEquality;
import org.aksw.jena_sparql_api.query_containment.index.NodeMapperOpContainment;
import org.aksw.jena_sparql_api.query_containment.index.OpContext;
import org.aksw.jena_sparql_api.query_containment.index.QueryContainmentIndex;
import org.aksw.jena_sparql_api.query_containment.index.QueryContainmentIndexImpl;
import org.aksw.jena_sparql_api.query_containment.index.ResidualMatching;
import org.aksw.jena_sparql_api.query_containment.index.SparqlQueryContainmentIndex;
import org.aksw.jena_sparql_api.query_containment.index.SparqlQueryContainmentIndexImpl;
import org.aksw.jena_sparql_api.query_containment.index.SparqlTreeMapping;
import org.aksw.jena_sparql_api.query_containment.index.TreeMapping;
import org.aksw.jena_sparql_api.stmt.SparqlQueryParserImpl;
import org.aksw.jena_sparql_api.update.FluentSparqlService;
Expand All @@ -49,10 +48,11 @@
import org.apache.jena.sparql.algebra.Algebra;
import org.apache.jena.sparql.algebra.Op;
import org.apache.jena.sparql.util.NodeUtils;
import org.jgrapht.DirectedGraph;
import org.jgrapht.Graph;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.codepoetics.protonpack.functions.TriFunction;
import com.google.common.base.Stopwatch;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.BiMap;
Expand All @@ -74,7 +74,7 @@ public static void main(String[] args) throws Exception {
SparqlService ss = FluentSparqlService.http("http://lsq.aksw.org/sparql").create();

emf.setSparqlService(ss);
emf.addScanPackageName(MainSparqlQueryToGraph.class.getPackage().getName());
emf.addScanPackageName(SubGraphIsomorphismIndexTests.class.getPackage().getName());
RdfEntityManager em = emf.getObject();

List<LsqQuery> lsqQueries;
Expand Down Expand Up @@ -457,19 +457,22 @@ public static void doRun(List<LsqQuery> lsqQueries) throws Exception {
}


BiFunction<OpContext, OpContext, NodeMapperOp> nodeMapperFactory = (a, b) -> new NodeMapperOpEquality();

//BiFunction<OpContext, OpContext, NodeMapperOp> nodeMapperFactory = (a, b) -> new NodeMapperOpEquality();

TriFunction<OpContext, OpContext, Table<Op, Op, BiMap<Node, Node>>, NodeMapperOp> nodeMapperFactory = NodeMapperOpContainment::new; //(aContext, bContext) -> new NodeMapperOpContainment(aContext, bContext);

//TriFunction<OpContext, OpContext, Table<Op, Op, BiMap<Node, Node>>, NodeMapperOp> nodeMapperFactory = NodeMapperOpEquality::new;
//QueryContainmentIndex<Node, DirectedGraph<Node, Triple>, Node, Op, Op> indexA = QueryContainmentIndexImpl.create(nodeMapper);
//QueryContainmentIndex<Node, DirectedGraph<Node, Triple>, Node, Op, Op> indexB = QueryContainmentIndexImpl.createFlat(nodeMapper);

SubgraphIsomorphismIndex<Entry<Node, Long>, DirectedGraph<Node, Triple>, Node> siiTreeTags = SubgraphIsomorphismIndexJena.create();
SubgraphIsomorphismIndex<Entry<Node, Long>, DirectedGraph<Node, Triple>, Node> siiFlat = SubgraphIsomorphismIndexJena.createFlat();
SubgraphIsomorphismIndex<Entry<Node, Long>, DirectedGraph<Node, Triple>, Node> siiTagBased = SubgraphIsomorphismIndexJena.createTagBased(new TagMapSetTrie<>(NodeUtils::compareRDFTerms));
SubgraphIsomorphismIndex<Entry<Node, Long>, Graph<Node, Triple>, Node> siiTreeTags = SubgraphIsomorphismIndexJena.create();
SubgraphIsomorphismIndex<Entry<Node, Long>, Graph<Node, Triple>, Node> siiFlat = SubgraphIsomorphismIndexJena.createFlat();
SubgraphIsomorphismIndex<Entry<Node, Long>, Graph<Node, Triple>, Node> siiTagBased = SubgraphIsomorphismIndexJena.createTagBased(new TagMapSetTrie<>(NodeUtils::compareRDFTerms));

SubgraphIsomorphismIndex<Entry<Node, Long>, DirectedGraph<Node, Triple>, Node> siiValidating = ValidationUtils.createValidatingProxy(SubgraphIsomorphismIndex.class, siiTreeTags, siiTagBased);
SubgraphIsomorphismIndex<Entry<Node, Long>, DirectedGraph<Node, Triple>, Node> sii = siiTreeTags; //siiValidating;
SubgraphIsomorphismIndex<Entry<Node, Long>, Graph<Node, Triple>, Node> siiValidating = ValidationUtils.createValidatingProxy(SubgraphIsomorphismIndex.class, siiTreeTags, siiTagBased);
SubgraphIsomorphismIndex<Entry<Node, Long>, Graph<Node, Triple>, Node> sii = siiTreeTags; //siiValidating;

QueryContainmentIndex<Node, DirectedGraph<Node, Triple>, Node, Op, ResidualMatching> index = QueryContainmentIndexImpl.create(sii, nodeMapperFactory);
SparqlQueryContainmentIndex<Node, ResidualMatching>index = SparqlQueryContainmentIndexImpl.create(sii, nodeMapperFactory);

//QueryContainmentIndex<Node, DirectedGraph<Node, Triple>, Node, Op, Op> index = ValidationUtils.createValidatingProxy(QueryContainmentIndex.class, indexA, indexB);

Expand Down Expand Up @@ -653,7 +656,7 @@ public static void doRun(List<LsqQuery> lsqQueries) throws Exception {
// siiA.printTree();

//Thread.sleep(5000);
Multimap<Node, TreeMapping<Op, Op, BiMap<Node, Node>, ResidualMatching>> matches = ArrayListMultimap.create();
Multimap<Node, SparqlTreeMapping<ResidualMatching>> matches = ArrayListMultimap.create();

System.out.println("Querying view candidates of: " + e.getKey());
Op op = e.getValue();
Expand Down Expand Up @@ -681,7 +684,8 @@ public static void doRun(List<LsqQuery> lsqQueries) throws Exception {

// Find all isomorphic ones:
Set<Node> isomorphicKeys = matches.entries().stream().filter(jj -> {
TreeMapping<Op, Op, BiMap<Node, Node>, ResidualMatching> treeMapping = jj.getValue();
SparqlTreeMapping<ResidualMatching> treeMapping = jj.getValue();
//TreeMapping<Op, Op, BiMap<Node, Node>, ResidualMatching> treeMapping = jj.getValue();
Op rootA = treeMapping.getaTree().getRoot();
Op rootB = treeMapping.getbTree().getRoot();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,25 +11,46 @@
import org.aksw.commons.jena.jgrapht.PseudoGraphJenaGraph;
import org.aksw.jena_sparql_api.core.SparqlService;
import org.aksw.jena_sparql_api.mapper.jpa.core.SparqlEntityManagerFactory;
import org.aksw.jena_sparql_api.query_containment.core.SparqlQueryContainmentUtils;
import org.aksw.jena_sparql_api.update.FluentSparqlService;
import org.apache.jena.graph.Graph;
import org.apache.jena.graph.Node;
import org.apache.jena.query.Query;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.riot.Lang;
import org.apache.jena.riot.RDFDataMgr;
import org.apache.jena.sparql.algebra.Algebra;
import org.apache.jena.sparql.algebra.Op;
import org.apache.jena.sparql.algebra.OpAsQuery;
import org.jgrapht.graph.DefaultGraphType;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.common.collect.BiMap;
import com.google.common.collect.Multimap;


@Ignore
//@Ignore
public class SubGraphIsomorphismIndexTests {

private static final Logger logger = LoggerFactory.getLogger(SubGraphIsomorphismIndexTests.class);


protected static EntityManager em;

public static String clearProjection(String rawQueryStr) {
Query rawQuery = SparqlQueryContainmentUtils.queryParser.apply(rawQueryStr);
Op rawOp = Algebra.compile(rawQuery);
Op op = QueryToGraph.normalizeOpReplaceConstants(rawOp);
Query query = OpAsQuery.asQuery(op);
query.setQueryResultStar(true);

String result = "" + query;
return result;
}

@BeforeClass
public static void setup() throws Exception {
Model model = RDFDataMgr.loadModel("lsq-sparqlqc-synthetic-simple.ttl", Lang.TURTLE);
Expand All @@ -43,10 +64,12 @@ public static void setup() throws Exception {

public SubgraphIsomorphismIndex<String, String, Node> buildIndex(Collection<String> queryIds) {

logger.warn("Claiming a simple directed graph - although it may be a pseudo graph");

SubgraphIsomorphismIndex<String, Graph, Node> base =
SubgraphIsomorphismIndexWrapper.wrap(
SubgraphIsomorphismIndexJena.create(),
PseudoGraphJenaGraph::new);
jenaGraph -> new PseudoGraphJenaGraph(jenaGraph, DefaultGraphType.directedSimple()));

SubgraphIsomorphismIndex<String, String, Node> result =
SubgraphIsomorphismIndexWrapper.wrap(base, QueryToGraph::queryToGraph);
Expand All @@ -55,7 +78,12 @@ public SubgraphIsomorphismIndex<String, String, Node> buildIndex(Collection<Stri
for(String queryId : queryIds) {
LsqQuery lsqQuery = em.find(LsqQuery.class, queryId);

String queryStr = lsqQuery.getText();
// Transform the query so that no constants remain in basic graph patterns
// Example: ?s a ?o -> ?s ?p ?o . FILTER(?p = rdf:type)


String rawQueryStr = lsqQuery.getText();
String queryStr = clearProjection(rawQueryStr);
result.put(queryId, queryStr);
}

Expand All @@ -70,8 +98,11 @@ public void lookup(SubgraphIsomorphismIndex<String, String, Node> index, Collect
for(String queryId : queryIds) {
LsqQuery lsqQuery = em.find(LsqQuery.class, queryId);

String queryStr = lsqQuery.getText();
String rawQueryStr = lsqQuery.getText();
String queryStr = clearProjection(rawQueryStr);
System.out.println("Lookup result for " + queryId + ": " + queryStr);


Multimap<String, BiMap<Node, Node>> r = index.lookup(queryStr, false);

r.asMap().forEach((k, isos) -> {
Expand Down

0 comments on commit 20a0487

Please sign in to comment.