001/**
002 * Copyright (C) 2007 - 2016, Jens Lehmann
003 *
004 * This file is part of DL-Learner.
005 *
006 * DL-Learner is free software; you can redistribute it and/or modify
007 * it under the terms of the GNU General Public License as published by
008 * the Free Software Foundation; either version 3 of the License, or
009 * (at your option) any later version.
010 *
011 * DL-Learner is distributed in the hope that it will be useful,
012 * but WITHOUT ANY WARRANTY; without even the implied warranty of
013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
014 * GNU General Public License for more details.
015 *
016 * You should have received a copy of the GNU General Public License
017 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
018 */
019package org.dllearner.algorithms.qtl.operations.lgg;
020
021import com.google.common.collect.Sets;
022import org.apache.commons.lang3.tuple.Triple;
023import org.apache.jena.graph.Node;
024import org.apache.jena.graph.NodeFactory;
025import org.apache.jena.query.QueryExecutionFactory;
026import org.apache.jena.query.ResultSetFormatter;
027import org.apache.jena.rdf.model.Model;
028import org.apache.jena.rdf.model.ModelFactory;
029import org.apache.jena.riot.Lang;
030import org.apache.jena.riot.RDFDataMgr;
031import org.dllearner.algorithms.qtl.QueryTreeUtils;
032import org.dllearner.algorithms.qtl.datastructures.NodeInv;
033import org.dllearner.algorithms.qtl.datastructures.impl.RDFResourceTree;
034
035import java.io.ByteArrayInputStream;
036import java.io.StringReader;
037import java.util.ArrayList;
038import java.util.List;
039import java.util.Set;
040import java.util.stream.Collectors;
041
042/**
043 * An LGG generator based on syntax and structure only, i.e. without taking into account any type of
044 * Semantics.
045 *
046 * @author Lorenz Bühmann
047 *
048 */
049public class LGGGeneratorSimple extends AbstractLGGGenerator {
050
051        @Override
052        protected Set<Triple<Node, Node, Node>> getRelatedEdges(RDFResourceTree tree1, RDFResourceTree tree2) {
053                return Sets.intersection(tree1.getEdges(), tree2.getEdges())
054                                .stream()
055                                .map(e -> Triple.of(e, e, e))
056                                .collect(Collectors.toSet());
057        }
058
059        @Override
060        protected boolean isSubTreeOf(RDFResourceTree tree1, RDFResourceTree tree2) {
061                return QueryTreeUtils.isSubsumedBy(tree1, tree2);
062        }
063
064        public static void main(String[] args) throws Exception {
065
066                String data = "@base <http://foo.bar/> ." +
067                                "<a> <p1> <b> .\n" +
068                                "<c> <p2> <b> .\n" +
069                                "<c> <p3> <d> .";
070                Model model = ModelFactory.createDefaultModel();
071                RDFDataMgr.read(model, new StringReader(data), "NULL", Lang.TURTLE);
072
073                model.write(System.out);
074
075                String q = "" +
076                                "BASE <http://foo.bar/> ASK   \n" +
077                                "WHERE {\n" +
078                                "  <a>  ((<>|!<>)|^(<>|!<>))* <d> .\n" +
079                                "}";
080
081                System.out.println(QueryExecutionFactory.create(q, model).execAsk());
082//              System.out.println(ResultSetFormatter.asText(QueryExecutionFactory.create(q, model).execSelect()));
083
084                // knowledge base
085//              SparqlEndpoint endpoint = SparqlEndpoint.getEndpointDBpedia();
086//              QueryExecutionFactory qef = FluentQueryExecutionFactory
087//                              .http(endpoint.getURL().toString(), endpoint.getDefaultGraphURIs()).config()
088//                              .withCache(CacheUtilsH2.createCacheFrontend("/tmp/cache", false, TimeUnit.DAYS.toMillis(60)))
089//                              .withPagination(10000).withDelay(50, TimeUnit.MILLISECONDS).end().create();
090//
091//              // tree generation
092//              ConciseBoundedDescriptionGenerator cbdGenerator = new ConciseBoundedDescriptionGeneratorImpl(qef);
093//              int maxDepth = 2;
094//              cbdGenerator.setRecursionDepth(maxDepth);
095//
096//              QueryTreeFactory treeFactory = new QueryTreeFactoryBase();
097//              treeFactory.setMaxDepth(maxDepth);
098//              treeFactory.addDropFilters(
099//                              new PredicateDropStatementFilter(StopURIsDBpedia.get()),
100//                              new PredicateDropStatementFilter(StopURIsRDFS.get()),
101//                              new PredicateDropStatementFilter(StopURIsOWL.get()),
102//                              new NamespaceDropStatementFilter(
103//                                              Sets.newHashSet(
104//                                                              "http://dbpedia.org/property/",
105//                                                              "http://purl.org/dc/terms/",
106//                                                              "http://dbpedia.org/class/yago/",
107//                                                              "http://www.w3.org/2003/01/geo/wgs84_pos#",
108//                                                              "http://www.georss.org/georss/",
109//                                                              FOAF.getURI()
110//                                                              )
111//                                                              )
112//                              );
113//              List<RDFResourceTree> trees = new ArrayList<>();
114//              List<String> resources = Lists.newArrayList("http://dbpedia.org/resource/Leipzig", "http://dbpedia.org/resource/Dresden");
115//              for(String resource : resources){
116//                      try {
117//                              System.out.println(resource);
118//                              Model model = cbdGenerator.getConciseBoundedDescription(resource);
119//                              RDFResourceTree tree = treeFactory.getQueryTree(ResourceFactory.createResource(resource), model);
120//                              System.out.println(tree.getStringRepresentation());
121//                              trees.add(tree);
122//                      } catch (Exception e) {
123//                              e.printStackTrace();
124//                      }
125//              }
126                
127                // LGG computation
128                LGGGenerator lggGen = new LGGGeneratorSimple();
129//              RDFResourceTree lgg = lggGen.getLGG(trees);
130//
131//              System.out.println("LGG");
132//              System.out.println(lgg.getStringRepresentation());
133//              System.out.println(QueryTreeUtils.toSPARQLQueryString(lgg));
134//              System.out.println(QueryTreeUtils.toOWLClassExpression(lgg));
135
136//              Node edge = NodeFactory.createURI("urn:p");
137//              Node edgeInv = new NodeInv(edge);
138//
139//              RDFResourceTree tree1 = new RDFResourceTree(NodeFactory.createURI("urn:a"));
140//              tree1.addChild(new RDFResourceTree(NodeFactory.createURI("urn:c")), edge);
141//              tree1.addChild(new RDFResourceTree(NodeFactory.createURI("urn:d")), edgeInv);
142//              System.out.println(tree1.getStringRepresentation());
143//
144//              RDFResourceTree tree2 = new RDFResourceTree(NodeFactory.createURI("urn:b"));
145//              tree2.addChild(new RDFResourceTree(NodeFactory.createURI("urn:c")), edge);
146//              tree2.addChild(new RDFResourceTree(NodeFactory.createURI("urn:d")), edgeInv);
147//              System.out.println(tree2.getStringRepresentation());
148//
149//              RDFResourceTree lgg = lggGen.getLGG(tree1, tree2);
150//              System.out.println("LGG");
151//              System.out.println(lgg.getStringRepresentation());
152//              System.out.println(QueryTreeUtils.toSPARQLQueryString(lgg));
153        }
154
155}