package org.aksw.jena_sparql_api.sparql_path2; import org.aksw.jena_sparql_api.jgrapht.LabeledEdge; import org.aksw.jena_sparql_api.util.sparql.syntax.path.PathVisitorRewriteInvert; import org.aksw.jena_sparql_api.util.sparql.syntax.path.PathVisitorTopDown; import org.apache.jena.sparql.path.Path; import org.jgrapht.VertexFactory; import org.jgrapht.graph.DefaultDirectedGraph; public class PathCompiler { public static Nfa<Integer, LabeledEdge<Integer, PredicateClass>> compileToNfa(Path path) { //Path path = PathParser.parse("!(<p>|(<p>|<p>))", PrefixMapping.Extended); path = PathVisitorTopDown.apply(path, new PathVisitorRewriteInvert()); /* * Some ugly set up of graph related stuff */ EdgeFactoryLabeledEdge<Integer, PredicateClass> edgeFactory = new EdgeFactoryLabeledEdge<Integer, PredicateClass>(); EdgeLabelAccessor<LabeledEdge<Integer, PredicateClass>, PredicateClass> edgeLabelAccessor = new EdgeLabelAccessorImpl<Integer, LabeledEdge<Integer, PredicateClass>, PredicateClass>(); DefaultDirectedGraph<Integer, LabeledEdge<Integer, PredicateClass>> graph = new DefaultDirectedGraph<Integer, LabeledEdge<Integer, PredicateClass>>(edgeFactory); VertexFactory<Integer> vertexFactory = new VertexFactoryInteger(graph); PathVisitorNfaCompilerImpl<Integer, LabeledEdge<Integer, PredicateClass>, PredicateClass> nfaCompiler = new PathVisitorNfaCompilerImpl<Integer, LabeledEdge<Integer, PredicateClass>, PredicateClass>(graph, vertexFactory, edgeLabelAccessor, x -> PathVisitorPredicateClass.transform(x)); /* * The actual nfa conversion step */ path.visit(nfaCompiler); Nfa<Integer, LabeledEdge<Integer, PredicateClass>> result = nfaCompiler.complete(); return result; } }