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}