private void TestExplainProcessor(String query)
        {
            if (this._processor == null)
            {
                TripleStore store = new TripleStore();
                Graph g = new Graph();
                g.LoadFromFile("InferenceTest.ttl");
                g.BaseUri = null;
                store.Add(g);

                this._processor = new ExplainQueryProcessor(store);
            }

            SparqlQuery q = this._parser.ParseFromString(query);
            Object results;
            Console.WriteLine("Input Query:");
            Console.WriteLine(this._formatter.Format(q));
            Console.WriteLine();

            Console.WriteLine("Explanation with Default Options (Simulated):");
            this._processor.ExplanationLevel = ExplanationLevel.DefaultSimulation;
            results = this._processor.ProcessQuery(q);

            Console.WriteLine();
            Console.WriteLine("Explanation with Default Options:");
            this._processor.ExplanationLevel = ExplanationLevel.Default;
            results = this._processor.ProcessQuery(q);

            Console.WriteLine();
            Console.WriteLine("Explanation with Full Options:");
            this._processor.ExplanationLevel = ExplanationLevel.Full;
            results = this._processor.ProcessQuery(q);
        }
        public CoffeeAndTea GetPlacesThatServeBreakfastAndTea()
        {
            //Then we can parse a SPARQL string into a query
            SparqlQuery query = _parser.ParseFromString(@"
            PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
            PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
            PREFIX foursquare: <http://www.semanticweb.org/hekurankastrati/ontologies/2019/5/foursquare#>
            SELECT ?place ?address
            WHERE {
              ?place foursquare:hasInfo ?info .
              ?info foursquare:hasAddress ?address
              { ?place rdf:type foursquare:BreakFast }
              UNION
              { ?place rdf:type foursquare:CoffeAndTea }
            }");

            //Create a dataset for our queries to operate over
            //We need to explicitly state our default graph or the unnamed graph is used
            //Alternatively you can set the second parameter to true to use the union of all graphs
            //as the default graph
            InMemoryDataset ds = new InMemoryDataset(_foursquareGraph);

            //Get the Query processor
            ISparqlQueryProcessor processor = new ExplainQueryProcessor(ds);

            CoffeeAndTea dto = new CoffeeAndTea
            {
                Data = new List <Data>()
            };
            //Use the SparqlQueryParser to give us a SparqlQuery object
            //Should get a Graph back from a CONSTRUCT query
            Object results = processor.ProcessQuery(query);

            if (results is SparqlResultSet resultSet)
            {
                foreach (SparqlResult result in resultSet.Results)
                {
                    string addressData = result.TryGetValue("address", out var node)
                        ? ((IUriNode)node).Uri.Fragment.Replace('#', ' ')
                        : string.Empty;
                    string placeData = result.TryGetValue("place", out var placeNode)
                        ? ((IUriNode)placeNode).Uri.Fragment.Replace('#', ' ')
                        : string.Empty;

                    dto.Data.Add(new Data
                    {
                        Address = addressData,
                        Place   = placeData
                    });
                }

//                dto.Data.Add(new Data
//                {
//                    Address = "test",
//                    Place = "asda"
//                });
            }

            return(dto);
        }
        public TopPosts GetTopVotedPosts(int numberOfResults = 10)
        {
            //Then we can parse a SPARQL string into a query
            SparqlQuery query = _parser.ParseFromString(@"
            PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
            PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
            PREFIX reddit: <http://www.semanticweb.org/hekurankastrati/ontologies/2019/4/reddit#>
            SELECT ?post ?title ?date ?votes
            WHERE { 
              ?post rdf:type ?type.
              ?type rdfs:subClassOf* reddit:Post.
              ?post reddit:hasTitle ?title .
              ?post reddit:hasDateCreated ?date .
              ?post reddit:hasVotes ?votes .
            }
            ORDER BY DESC(?votes)
            LIMIT " + numberOfResults);

            InMemoryDataset ds = new InMemoryDataset(_redditGraph);

            //Get the Query processor
            ISparqlQueryProcessor processor = new ExplainQueryProcessor(ds);

            TopPosts dto = new TopPosts
            {
                Data = new List <TopPostsData>()
            };

            Object results = processor.ProcessQuery(query);

            if (results is SparqlResultSet resultSet)
            {
                foreach (SparqlResult result in resultSet.Results)
                {
                    string post = result.TryGetValue("post", out var node)
                        ? ((IUriNode)node).Uri.Fragment.Replace('#', ' ')
                        : string.Empty;
                    string title = result.TryGetValue("title", out var titleNode)
                        ? ((ILiteralNode)titleNode).Value
                        : string.Empty;
                    string date = result.TryGetValue("date", out var dateNode)
                        ? ((ILiteralNode)dateNode).Value
                        : string.Empty;
                    string votes = result.TryGetValue("votes", out var votesNode)
                        ? ((ILiteralNode)votesNode).Value
                        : string.Empty;

                    dto.Data.Add(new TopPostsData
                    {
                        Post  = post,
                        Title = title,
                        Date  = date,
                        Votes = votes
                    });
                }
            }

            return(dto);
        }
        public PlacesAndLikes GetAllLikesForDinnerPlace(string inputPlace)
        {
            //Then we can parse a SPARQL string into a query
            SparqlQuery query = _parser.ParseFromString(@"
            PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
            PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
            PREFIX foursquare: <http://www.semanticweb.org/hekurankastrati/ontologies/2019/5/foursquare#>
            SELECT ?place (COUNT(?profile) as ?likes)
            WHERE {
            ?place rdf:type foursquare:" + inputPlace + @" .
            ?profile rdf:type foursquare:Profile .
            ?profile foursquare:hasLikedPlace ?place .
            }
            GROUP BY ?place");

            InMemoryDataset ds = new InMemoryDataset(_foursquareGraph);

            //Get the Query processor
            ISparqlQueryProcessor processor = new ExplainQueryProcessor(ds);

            PlacesAndLikes dto = new PlacesAndLikes
            {
                Data = new List <PlacesAndLikesData>()
            };

            Object results = processor.ProcessQuery(query);

            if (results is SparqlResultSet resultSet)
            {
                foreach (SparqlResult result in resultSet.Results)
                {
                    string place = result.TryGetValue("place", out var node)
                        ? ((IUriNode)node).Uri.Fragment.Replace('#', ' ')
                        : string.Empty;
                    string likes = result.TryGetValue("likes", out var likeNode)
                        ? ((LongNode)likeNode).Value
                        : string.Empty;

                    dto.Data.Add(new PlacesAndLikesData
                    {
                        Place = place,
                        Likes = likes
                    });
                }
            }

            return(dto);
        }
        public fclsExplanation(SparqlQuery query, long parseTime)
        {
            InitializeComponent();

            this.lblParseTime.Text = "Took " + parseTime + "ms to parse";
            this.txtQuery.Text     = this._formatter.Format(query);

            //First need to create the Explanation
            using (StreamWriter writer = new StreamWriter("explain.temp", false, Encoding.UTF8))
            {
                ExplainQueryProcessor processor = new ExplainQueryProcessor(new TripleStore());
                processor.ExplanationLevel = (ExplanationLevel.OutputToTrace | ExplanationLevel.ShowAll | ExplanationLevel.AnalyseAll | ExplanationLevel.Simulate) ^ ExplanationLevel.ShowThreadID ^ ExplanationLevel.ShowTimings ^ ExplanationLevel.ShowIntermediateResultCount;

                TextWriterTraceListener listener = new TextWriterTraceListener(writer, "SparqlGUI");
                Trace.Listeners.Add(listener);
                try
                {
                    Object results = processor.ProcessQuery(query);
                }
                catch
                {
                    throw;
                }
                finally
                {
                    Trace.Listeners.Remove(listener);
                }

                writer.Close();
            }

            //Then need to display it
            using (StreamReader reader = new StreamReader("explain.temp"))
            {
                this.txtExplanation.Text = reader.ReadToEnd();
                reader.Close();
            }
        }
        public fclsExplanation(SparqlQuery query, long parseTime)
        {
            InitializeComponent();

            this.lblParseTime.Text = "Took " + parseTime + "ms to parse";
            this.txtQuery.Text = this._formatter.Format(query);

            //First need to create the Explanation
            using (StreamWriter writer = new StreamWriter("explain.temp", false, Encoding.UTF8))
            {
                ExplainQueryProcessor processor = new ExplainQueryProcessor(new TripleStore());
                processor.ExplanationLevel = (ExplanationLevel.OutputToTrace | ExplanationLevel.ShowAll | ExplanationLevel.AnalyseAll | ExplanationLevel.Simulate) ^ ExplanationLevel.ShowThreadID ^ ExplanationLevel.ShowTimings ^ ExplanationLevel.ShowIntermediateResultCount;

                TextWriterTraceListener listener = new TextWriterTraceListener(writer, "SparqlGUI");
                Trace.Listeners.Add(listener);
                try
                {
                    Object results = processor.ProcessQuery(query);
                }
                catch
                {
                    throw;
                }
                finally
                {
                    Trace.Listeners.Remove(listener);
                }

                writer.Close();
            }

            //Then need to display it
            using (StreamReader reader = new StreamReader("explain.temp"))
            {
                this.txtExplanation.Text = reader.ReadToEnd();
                reader.Close();
            }
        }
        public List <string> GetPlacesWithSocialMedia()
        {
            //Then we can parse a SPARQL string into a query
            SparqlQuery query = _parser.ParseFromString(@"
            PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
            PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
            PREFIX foursquare: <http://www.semanticweb.org/hekurankastrati/ontologies/2019/5/foursquare#>
            SELECT ?socialmedia
            WHERE {
              { ?socialmedia rdf:type foursquare:Facebook }
              UNION
              { ?socialmedia rdf:type foursquare:Instagram}
            }");

            InMemoryDataset ds = new InMemoryDataset(_foursquareGraph);

            //Get the Query processor
            ISparqlQueryProcessor processor = new ExplainQueryProcessor(ds);

            List <string> places = new List <string>();

            Object results = processor.ProcessQuery(query);

            if (results is SparqlResultSet resultSet)
            {
                foreach (SparqlResult result in resultSet.Results)
                {
                    string place = result.TryGetValue("socialmedia", out var node)
                        ? ((IUriNode)node).Uri.Fragment.Replace('#', ' ')
                        : string.Empty;

                    places.Add(place);
                }
            }

            return(places);
        }
Esempio n. 8
0
        public void RunQuery(String[] args) 
        {
            //If we can't set options then we abort
            if (!this.SetOptions(args))
            {
                return;
            }

            if (this._query == null)
            {
                //Try to read query from Standard In instead
                this._query = Console.In.ReadToEnd();
                if (this._query.Equals(String.Empty))
                {
                    Console.Error.WriteLine("rdfQuery: No Query was specified");
                    return;
                }
            }

            //Parse the Query
            try
            {
                SparqlQuery q = this._parser.ParseFromString(this._query);

                //Set Timeout if necessary
                q.Timeout = this._timeout;
                q.PartialResultsOnTimeout = this._partialResults;

                //Execute the Query unless print was specified
                Object results = null;
                if (!this._print)
                {
                    switch (this._mode)
                    {
                        case RdfQueryMode.Local:
                            if (this._explain)
                            {
                                ExplainQueryProcessor processor = new ExplainQueryProcessor(this._store, this._level);
                                results = processor.ProcessQuery(q);
                            }
                            else
                            {
                                results = this._store.ExecuteQuery(q);
                            }
                            break;
                        case RdfQueryMode.Remote:
                            if (this._explain) Console.Error.WriteLine("rdfQuery: Warning: Cannot explain queries when the query is being sent to a remote endpoint");
                            this._endpoint.Timeout = Convert.ToInt32(this._timeout);
                            switch (q.QueryType)
                            {
                                case SparqlQueryType.Construct:
                                case SparqlQueryType.Describe:
                                case SparqlQueryType.DescribeAll:
                                    results = this._endpoint.QueryWithResultGraph(this._query);
                                    break;
                                default:
                                    results = this._endpoint.QueryWithResultSet(this._query);
                                    break;
                            }
                            break;
                        case RdfQueryMode.Unknown:
                        default:
                            if (this._explain)
                            {
                                ExplainQueryProcessor processor = new ExplainQueryProcessor(new TripleStore(), this._level);
                                processor.ProcessQuery(q);
                            }
                            else
                            {
                                Console.Error.WriteLine("rdfQuery: There were no inputs or a remote endpoint specified in the arguments so no query can be executed");
                            }
                            return;
                    }
                }

                //Select the Output Stream
                StreamWriter output;
                if (this._output == null)
                {
                    output = new StreamWriter(Console.OpenStandardOutput());
                }
                else
                {
                    output = new StreamWriter(this._output);
                }

                if (!this._print)
                {
                    //Output the Results
                    if (results is SparqlResultSet)
                    {
                        this._resultsWriter.Save((SparqlResultSet)results, output);
                    }
                    else if (results is IGraph)
                    {
                        this._graphWriter.Save((IGraph)results, output);
                    }
                    else
                    {
                        Console.Error.WriteLine("rdfQuery: The Query resulted in an unknown result");
                    }
                }
                else
                {
                    //If Printing Print the Query then the Algebra
                    SparqlFormatter formatter = new SparqlFormatter(q.NamespaceMap);
                    output.WriteLine("Query");
                    output.WriteLine(formatter.Format(q));
                    output.WriteLine();
                    output.WriteLine("Algebra");
                    output.WriteLine(q.ToAlgebra().ToString());
                    output.Flush();
                    output.Close();
                }
            }
            catch (RdfQueryTimeoutException timeout)
            {
                Console.Error.WriteLine("rdfQuery: Query Timeout: " + timeout.Message);
                if (this._debug) this.DebugErrors(timeout);
                return;
            }
            catch (RdfQueryException queryEx)
            {
                Console.Error.WriteLine("rdfQuery: Query Error: " + queryEx.Message);
                if (this._debug) this.DebugErrors(queryEx);
                return;
            }
            catch (RdfParseException parseEx)
            {
                Console.Error.WriteLine("rdfQuery: Parser Error: " + parseEx.Message);
                if (this._debug) this.DebugErrors(parseEx);
                return;
            }
            catch (RdfException rdfEx)
            {
                Console.Error.WriteLine("rdfQuery: RDF Error: " + rdfEx.Message);
                if (this._debug) this.DebugErrors(rdfEx);
                return;
            }
            catch (Exception ex)
            {
                Console.Error.WriteLine("rdfQuery: Error: " + ex.Message);
                if (this._debug) this.DebugErrors(ex);
                return;
            }
        }
Esempio n. 9
0
        private void btnQuery_Click(object sender, EventArgs e)
        {
            try
            {
                SparqlQueryParser parser = new SparqlQueryParser();
                SparqlQuery       query  = parser.ParseFromString(this.txtQuery.Text);
                query.Timeout = (long)this.numTimeout.Value;
                query.PartialResultsOnTimeout = this.chkPartialResults.Checked;

                if (this._tripleCount == 0 && this._noDataWarning)
                {
                    switch (MessageBox.Show("You have no data loaded to query over - do you wish to run this query anyway?  Press Abort if you'd like to load data first, Retry to continue anyway or Ignore to continue anyway and suppress this message during this session", "Continue Query without Data", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Question))
                    {
                    case DialogResult.Abort:
                        return;

                    case DialogResult.Ignore:
                        //Set the Ignore flag then continue anyway
                        this._noDataWarning = false;
                        break;

                    default:
                        //Continue anyway
                        break;
                    }
                }

                this.LogStartQuery(query);

                //Evaluate the Query
                Object results;
                if (this._logExplain)
                {
                    using (StreamWriter writer = new StreamWriter(this._logfile, true, Encoding.UTF8))
                    {
                        ExplainQueryProcessor   explainer = new ExplainQueryProcessor(this._dataset, (ExplanationLevel.OutputToTrace | ExplanationLevel.ShowAll | ExplanationLevel.AnalyseAll) ^ ExplanationLevel.ShowThreadID);
                        TextWriterTraceListener listener  = new TextWriterTraceListener(writer, "SparqlGUI");
                        Trace.Listeners.Add(listener);
                        try
                        {
                            results = explainer.ProcessQuery(query);
                        }
                        finally
                        {
                            Trace.Listeners.Remove(listener);
                        }

                        writer.Close();
                    }
                }
                else
                {
                    results = this._processor.ProcessQuery(query);
                }

                //Process the Results
                if (results is IGraph)
                {
                    this.LogEndQuery(query, (IGraph)results);

                    if (this.chkViewResultsInApp.Checked)
                    {
                        GraphViewerForm graphViewer = new GraphViewerForm((IGraph)results, "SPARQL GUI");
                        graphViewer.Show();
                    }
                    else
                    {
                        this._rdfwriter.Save((IGraph)results, "temp" + this._rdfext);
                        System.Diagnostics.Process.Start("temp" + this._rdfext);
                    }
                }
                else if (results is SparqlResultSet)
                {
                    this.LogEndQuery(query, (SparqlResultSet)results);

                    if (this.chkViewResultsInApp.Checked)
                    {
                        ResultSetViewerForm resultSetViewer = new ResultSetViewerForm((SparqlResultSet)results, query.NamespaceMap, "SPARQL GUI");
                        resultSetViewer.Show();
                    }
                    else
                    {
                        this._resultswriter.Save((SparqlResultSet)results, "temp" + this._resultsext);
                        System.Diagnostics.Process.Start("temp" + this._resultsext);
                    }
                }
                else
                {
                    throw new RdfException("Unexpected Result Type");
                }
                this.stsLastQuery.Text = "Last Query took " + query.QueryExecutionTime;
            }
            catch (RdfParseException parseEx)
            {
                this.LogMalformedQuery(parseEx);
                MessageBox.Show("Query failed to parse:\n" + parseEx.Message, "Query Failed");
            }
            catch (RdfQueryException queryEx)
            {
                this.LogFailedQuery(queryEx);
                MessageBox.Show("Query failed during Execution:\n" + queryEx.Message, "Query Failed");
            }
            catch (Exception ex)
            {
                this.LogFailedQuery(ex);
                MessageBox.Show("Query failed:\n" + ex.Message + "\n" + ex.StackTrace, "Query Failed");
            }
        }
Esempio n. 10
0
        public void RunQuery(String[] args)
        {
            //If we can't set options then we abort
            if (!this.SetOptions(args))
            {
                return;
            }

            if (this._query == null)
            {
                //Try to read query from Standard In instead
                this._query = Console.In.ReadToEnd();
                if (this._query.Equals(String.Empty))
                {
                    Console.Error.WriteLine("rdfQuery: No Query was specified");
                    return;
                }
            }

            //Parse the Query
            try
            {
                SparqlQuery q = this._parser.ParseFromString(this._query);

                //Set Timeout if necessary
                q.Timeout = this._timeout;
                q.PartialResultsOnTimeout = this._partialResults;

                //Execute the Query unless print was specified
                Object results = null;
                if (!this._print)
                {
                    switch (this._mode)
                    {
                    case RdfQueryMode.Local:
                        if (this._explain)
                        {
                            var processor = new ExplainQueryProcessor(this._store, this._level);
                            results = processor.ProcessQuery(q);
                        }
                        else
                        {
                            var processor = new LeviathanQueryProcessor(_store);
                            results = processor.ProcessQuery(q);
                        }
                        break;

                    case RdfQueryMode.Remote:
                        if (this._explain)
                        {
                            Console.Error.WriteLine("rdfQuery: Warning: Cannot explain queries when the query is being sent to a remote endpoint");
                        }
                        this._endpoint.Timeout = Convert.ToInt32(this._timeout);
                        switch (q.QueryType)
                        {
                        case SparqlQueryType.Construct:
                        case SparqlQueryType.Describe:
                        case SparqlQueryType.DescribeAll:
                            results = this._endpoint.QueryWithResultGraph(this._query);
                            break;

                        default:
                            results = this._endpoint.QueryWithResultSet(this._query);
                            break;
                        }
                        break;

                    case RdfQueryMode.Unknown:
                    default:
                        if (this._explain)
                        {
                            ExplainQueryProcessor processor = new ExplainQueryProcessor(new TripleStore(), this._level);
                            processor.ProcessQuery(q);
                        }
                        else
                        {
                            Console.Error.WriteLine("rdfQuery: There were no inputs or a remote endpoint specified in the arguments so no query can be executed");
                        }
                        return;
                    }
                }

                //Select the Output Stream
                StreamWriter output;
                if (this._output == null)
                {
                    output = new StreamWriter(Console.OpenStandardOutput());
                }
                else
                {
                    output = new StreamWriter(this._output);
                }

                if (!this._print)
                {
                    //Output the Results
                    if (results is SparqlResultSet)
                    {
                        this._resultsWriter.Save((SparqlResultSet)results, output);
                    }
                    else if (results is IGraph)
                    {
                        this._graphWriter.Save((IGraph)results, output);
                    }
                    else
                    {
                        Console.Error.WriteLine("rdfQuery: The Query resulted in an unknown result");
                    }
                }
                else
                {
                    //If Printing Print the Query then the Algebra
                    SparqlFormatter formatter = new SparqlFormatter(q.NamespaceMap);
                    output.WriteLine("Query");
                    output.WriteLine(formatter.Format(q));
                    output.WriteLine();
                    output.WriteLine("Algebra");
                    output.WriteLine(q.ToAlgebra().ToString());
                    output.Flush();
                    output.Close();
                }
            }
            catch (RdfQueryTimeoutException timeout)
            {
                Console.Error.WriteLine("rdfQuery: Query Timeout: " + timeout.Message);
                if (this._debug)
                {
                    this.DebugErrors(timeout);
                }
                return;
            }
            catch (RdfQueryException queryEx)
            {
                Console.Error.WriteLine("rdfQuery: Query Error: " + queryEx.Message);
                if (this._debug)
                {
                    this.DebugErrors(queryEx);
                }
                return;
            }
            catch (RdfParseException parseEx)
            {
                Console.Error.WriteLine("rdfQuery: Parser Error: " + parseEx.Message);
                if (this._debug)
                {
                    this.DebugErrors(parseEx);
                }
                return;
            }
            catch (RdfException rdfEx)
            {
                Console.Error.WriteLine("rdfQuery: RDF Error: " + rdfEx.Message);
                if (this._debug)
                {
                    this.DebugErrors(rdfEx);
                }
                return;
            }
            catch (Exception ex)
            {
                Console.Error.WriteLine("rdfQuery: Error: " + ex.Message);
                if (this._debug)
                {
                    this.DebugErrors(ex);
                }
                return;
            }
        }
Esempio n. 11
0
        private void btnQuery_Click(object sender, EventArgs e)
        {
            try
            {
                SparqlQueryParser parser = new SparqlQueryParser();
                SparqlQuery query = parser.ParseFromString(this.txtQuery.Text);
                query.Timeout = (long)this.numTimeout.Value;
                query.PartialResultsOnTimeout = this.chkPartialResults.Checked;

                if (this._store.Graphs.Count == 0 && this._noDataWarning)
                {
                    switch (MessageBox.Show("You have no data loaded to query over - do you wish to run this query anyway?  Press Abort if you'd like to load data first, Retry to continue anyway or Ignore to continue anyway and suppress this message during this session", "Continue Query without Data", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Question))
                    {
                        case DialogResult.Abort:
                            return;
                        case DialogResult.Ignore:
                            //Set the Ignore flag then continue anyway
                            this._noDataWarning = false;
                            break;
                        default:
                            //Continue anyway
                            break;
                    }
                }

                this.LogStartQuery(query);

                //Evaluate the Query
                Object results;
                if (this._logExplain)
                {
                    using (StreamWriter writer = new StreamWriter(this._logfile, true, Encoding.UTF8))
                    {
                        ExplainQueryProcessor explainer = new ExplainQueryProcessor(this._store, (ExplanationLevel.OutputToTrace | ExplanationLevel.ShowAll | ExplanationLevel.AnalyseAll ) ^ ExplanationLevel.ShowThreadID);
                        TextWriterTraceListener listener = new TextWriterTraceListener(writer, "SparqlGUI");
                        Trace.Listeners.Add(listener);
                        try
                        {
                            results = explainer.ProcessQuery(query);
                        }
                        finally
                        {
                            Trace.Listeners.Remove(listener);
                        }

                        writer.Close();
                    }
                }
                else
                {
                    results = this._store.ExecuteQuery(query);
                }

                //Process the Results
                if (results is IGraph)
                {
                    this.LogEndQuery(query, (IGraph)results);

                    if (this.chkViewResultsInApp.Checked)
                    {
                        GraphViewerForm graphViewer = new GraphViewerForm((IGraph)results, "SPARQL GUI");
                        graphViewer.Show();
                    }
                    else
                    {
                        this._rdfwriter.Save((IGraph)results, "temp" + this._rdfext);
                        System.Diagnostics.Process.Start("temp" + this._rdfext);
                    }
                }
                else if (results is SparqlResultSet)
                {
                    this.LogEndQuery(query, (SparqlResultSet)results);

                    if (this.chkViewResultsInApp.Checked)
                    {
                        ResultSetViewerForm resultSetViewer = new ResultSetViewerForm((SparqlResultSet)results, "SPARQL GUI");
                        resultSetViewer.Show();
                    }
                    else
                    {
                        this._resultswriter.Save((SparqlResultSet)results, "temp" + this._resultsext);
                        System.Diagnostics.Process.Start("temp" + this._resultsext);
                    }
                }
                else
                {
                    throw new RdfException("Unexpected Result Type");
                }
                this.stsLastQuery.Text = "Last Query took " + query.QueryTime + " ms";
            }
            catch (RdfParseException parseEx)
            {
                this.LogMalformedQuery(parseEx);
                MessageBox.Show("Query failed to parse:\n" + parseEx.Message, "Query Failed");
            }
            catch (RdfQueryException queryEx)
            {
                this.LogFailedQuery(queryEx);
                MessageBox.Show("Query failed during Execution:\n" + queryEx.Message, "Query Failed");
            }
            catch (Exception ex)
            {
                this.LogFailedQuery(ex);
                MessageBox.Show("Query failed:\n" + ex.Message + "\n" + ex.StackTrace, "Query Failed");
            }
        }