/// <summary> /// Builds a query result corresponding to the given graph /// </summary> public static RDFDescribeQueryResult FromRDFGraph(RDFGraph graph) { RDFDescribeQueryResult result = new RDFDescribeQueryResult(String.Empty); if (graph != null) { //Transform the graph into a datatable and assign it to the query result result.DescribeResults = graph.ToDataTable(); } return result; }
/// <summary> /// Gets a query result corresponding to the given memory store /// </summary> public static RDFDescribeQueryResult FromRDFMemoryStore(RDFMemoryStore store) { RDFDescribeQueryResult result = new RDFDescribeQueryResult(string.Empty); if (store != null) { //Transform the memory store into a datatable and assign it to the query result result.DescribeResults = store.ToDataTable(); } return(result); }
/// <summary> /// Gets a query result corresponding to the given graph /// </summary> public static RDFDescribeQueryResult FromRDFGraph(RDFGraph graph) { RDFDescribeQueryResult result = new RDFDescribeQueryResult(string.Empty); if (graph != null) { //Transform the graph into a datatable and assign it to the query result result.DescribeResults = graph.ToDataTable(); } return(result); }
/// <summary> /// Applies the query to the given store /// </summary> public RDFDescribeQueryResult ApplyToStore(RDFStore store) { if (store != null) { this.PatternGroupResultTables.Clear(); this.PatternResultTables.Clear(); RDFDescribeQueryResult describeResult = new RDFDescribeQueryResult(this.ToString()); if (!this.IsEmpty) { //Iterate the pattern groups of the query foreach (RDFPatternGroup patternGroup in this.PatternGroups) { //Step 1: Get the intermediate result tables of the current pattern group RDFDescribeQueryEngine.EvaluatePatterns(this, patternGroup, store); //Step 2: Get the result table of the current pattern group RDFDescribeQueryEngine.CombinePatterns(this, patternGroup); //Step 3: Apply the filters of the current pattern group to its result table RDFDescribeQueryEngine.ApplyFilters(this, patternGroup); } //Step 4: Get the result table of the query DataTable queryResultTable = RDFQueryEngine.CombineTables(this.PatternGroupResultTables.Values.ToList <DataTable>(), false); //Step 5: Describe the terms from the result table DataTable describeResultTable = RDFDescribeQueryEngine.DescribeTerms(this, store, queryResultTable); //Step 6: Apply the modifiers of the query to the result table describeResult.DescribeResults = RDFDescribeQueryEngine.ApplyModifiers(this, describeResultTable); } else { //In this case the only chance to proceed is to have resources in the describe terms, //which will be used to search for S-P-O data. Variables are omitted in this scenario. if (this.DescribeTerms.Any(dt => dt is RDFResource)) { //Step 1: Describe the terms from the result table DataTable describeResultTable = RDFDescribeQueryEngine.DescribeTerms(this, store, new DataTable()); //Step 2: Apply the modifiers of the query to the result table describeResult.DescribeResults = RDFDescribeQueryEngine.ApplyModifiers(this, describeResultTable); } } return(describeResult); } throw new RDFQueryException("Cannot execute DESCRIBE query because given \"store\" parameter is null."); }
/// <summary> /// Applies the query to the given SPARQL endpoint /// </summary> public RDFDescribeQueryResult ApplyToSPARQLEndpoint(RDFSPARQLEndpoint sparqlEndpoint) { RDFDescribeQueryResult describeResult = new RDFDescribeQueryResult(this.ToString()); if (sparqlEndpoint != null) { RDFQueryEvents.RaiseDESCRIBEQueryEvaluation(String.Format("Evaluating DESCRIBE query on SPARQL endpoint '{0}'...", sparqlEndpoint)); //Establish a connection to the given SPARQL endpoint using (WebClient webClient = new WebClient()) { //Insert reserved "query" parameter webClient.QueryString.Add("query", HttpUtility.UrlEncode(this.ToString())); //Insert user-provided parameters webClient.QueryString.Add(sparqlEndpoint.QueryParams); //Insert request headers webClient.Headers.Add(HttpRequestHeader.Accept, "application/turtle"); webClient.Headers.Add(HttpRequestHeader.Accept, "text/turtle"); //Send querystring to SPARQL endpoint var sparqlResponse = webClient.DownloadData(sparqlEndpoint.BaseAddress); //Parse response from SPARQL endpoint if (sparqlResponse != null) { using (var sStream = new MemoryStream(sparqlResponse)) { describeResult = RDFDescribeQueryResult.FromRDFGraph(RDFGraph.FromStream(RDFModelEnums.RDFFormats.Turtle, sStream)); } describeResult.DescribeResults.TableName = this.ToString(); } } //Eventually adjust column names (should start with "?") Int32 columnsCount = describeResult.DescribeResults.Columns.Count; for (Int32 i = 0; i < columnsCount; i++) { if (!describeResult.DescribeResults.Columns[i].ColumnName.StartsWith("?")) { describeResult.DescribeResults.Columns[i].ColumnName = "?" + describeResult.DescribeResults.Columns[i].ColumnName; } } RDFQueryEvents.RaiseDESCRIBEQueryEvaluation(String.Format("Evaluated DESCRIBE query on SPARQL endpoint '{0}': Found '{1}' results.", sparqlEndpoint, describeResult.DescribeResultsCount)); } return(describeResult); }
/// <summary> /// Applies the query to the given SPARQL endpoint /// </summary> public RDFDescribeQueryResult ApplyToSPARQLEndpoint(RDFSPARQLEndpoint sparqlEndpoint) { string describeQueryString = this.ToString(); RDFDescribeQueryResult describeResult = new RDFDescribeQueryResult(describeQueryString); if (sparqlEndpoint != null) { //Establish a connection to the given SPARQL endpoint using (WebClient webClient = new WebClient()) { //Insert reserved "query" parameter webClient.QueryString.Add("query", HttpUtility.UrlEncode(describeQueryString)); //Insert user-provided parameters webClient.QueryString.Add(sparqlEndpoint.QueryParams); //Insert request headers webClient.Headers.Add(HttpRequestHeader.Accept, "application/turtle"); webClient.Headers.Add(HttpRequestHeader.Accept, "text/turtle"); //Send querystring to SPARQL endpoint byte[] sparqlResponse = webClient.DownloadData(sparqlEndpoint.BaseAddress); //Parse response from SPARQL endpoint if (sparqlResponse != null) { using (MemoryStream sStream = new MemoryStream(sparqlResponse)) describeResult = RDFDescribeQueryResult.FromRDFGraph(RDFGraph.FromStream(RDFModelEnums.RDFFormats.Turtle, sStream)); describeResult.DescribeResults.TableName = describeQueryString; } } //Eventually adjust column names (should start with "?") int columnsCount = describeResult.DescribeResults.Columns.Count; for (int i = 0; i < columnsCount; i++) { if (!describeResult.DescribeResults.Columns[i].ColumnName.StartsWith("?")) { describeResult.DescribeResults.Columns[i].ColumnName = string.Concat("?", describeResult.DescribeResults.Columns[i].ColumnName); } } } return(describeResult); }
/// <summary> /// Applies the query to the given federation /// </summary> public RDFDescribeQueryResult ApplyToFederation(RDFFederation federation) { if (federation != null) { this.PatternGroupResultTables.Clear(); this.PatternResultTables.Clear(); RDFDescribeQueryResult describeResult = new RDFDescribeQueryResult(this.ToString()); if (!this.IsEmpty) { //Iterate the pattern groups of the query var fedPatternResultTables = new Dictionary<RDFPatternGroup, List<DataTable>>(); foreach (RDFPatternGroup patternGroup in this.PatternGroups) { #region TrueFederations foreach (RDFStore store in federation.Stores.Values) { //Step 1: Evaluate the patterns of the current pattern group on the current store RDFDescribeQueryEngine.EvaluatePatterns(this, patternGroup, store); //Step 2: Federate the patterns of the current pattern group on the current store if (!fedPatternResultTables.ContainsKey(patternGroup)) { fedPatternResultTables.Add(patternGroup, this.PatternResultTables[patternGroup]); } else { fedPatternResultTables[patternGroup].ForEach(fprt => fprt.Merge(this.PatternResultTables[patternGroup].Single(prt => prt.TableName.Equals(fprt.TableName, StringComparison.Ordinal)), true, MissingSchemaAction.Add)); } } this.PatternResultTables[patternGroup] = fedPatternResultTables[patternGroup]; #endregion //Step 3: Get the result table of the current pattern group RDFDescribeQueryEngine.CombinePatterns(this, patternGroup); //Step 4: Apply the filters of the current pattern group to its result table RDFDescribeQueryEngine.ApplyFilters(this, patternGroup); } //Step 5: Get the result table of the query DataTable queryResultTable = RDFQueryEngine.CombineTables(this.PatternGroupResultTables.Values.ToList<DataTable>(), false); //Step 6: Describe the terms on each store and merge them in the federated result table DataTable describeResultTable = new DataTable(this.ToString()); foreach (RDFStore store in federation.Stores.Values) { describeResultTable.Merge(RDFDescribeQueryEngine.DescribeTerms(this, store, queryResultTable), true, MissingSchemaAction.Add); } //Step 7: Apply the modifiers of the query to the result table describeResult.DescribeResults = RDFDescribeQueryEngine.ApplyModifiers(this, describeResultTable); } else { //In this case the only chance to proceed is to have resources in the describe terms, //which will be used to search for S-P-O data. Variables are ignored in this scenario. if (this.DescribeTerms.Any(dt => dt is RDFResource)) { //Step 1: Describe the terms on each store and merge them in the federated result table DataTable describeResultTable = new DataTable(this.ToString()); foreach (RDFStore store in federation.Stores.Values) { describeResultTable.Merge(RDFDescribeQueryEngine.DescribeTerms(this, store, new DataTable()), true, MissingSchemaAction.Add); } //Step 2: Apply the modifiers of the query to the result table describeResult.DescribeResults = RDFDescribeQueryEngine.ApplyModifiers(this, describeResultTable); } } return describeResult; } throw new RDFQueryException("Cannot execute DESCRIBE query because given \"federation\" parameter is null."); }
/// <summary> /// Applies the query to the given store /// </summary> public RDFDescribeQueryResult ApplyToStore(RDFStore store) { if (store != null) { this.PatternGroupResultTables.Clear(); this.PatternResultTables.Clear(); RDFDescribeQueryResult describeResult = new RDFDescribeQueryResult(this.ToString()); if (!this.IsEmpty) { //Iterate the pattern groups of the query foreach (RDFPatternGroup patternGroup in this.PatternGroups) { //Step 1: Get the intermediate result tables of the current pattern group RDFDescribeQueryEngine.EvaluatePatterns(this, patternGroup, store); //Step 2: Get the result table of the current pattern group RDFDescribeQueryEngine.CombinePatterns(this, patternGroup); //Step 3: Apply the filters of the current pattern group to its result table RDFDescribeQueryEngine.ApplyFilters(this, patternGroup); } //Step 4: Get the result table of the query DataTable queryResultTable = RDFQueryEngine.CombineTables(this.PatternGroupResultTables.Values.ToList<DataTable>(), false); //Step 5: Describe the terms from the result table DataTable describeResultTable = RDFDescribeQueryEngine.DescribeTerms(this, store, queryResultTable); //Step 6: Apply the modifiers of the query to the result table describeResult.DescribeResults = RDFDescribeQueryEngine.ApplyModifiers(this, describeResultTable); } else { //In this case the only chance to proceed is to have resources in the describe terms, //which will be used to search for S-P-O data. Variables are omitted in this scenario. if (this.DescribeTerms.Any(dt => dt is RDFResource)) { //Step 1: Describe the terms from the result table DataTable describeResultTable = RDFDescribeQueryEngine.DescribeTerms(this, store, new DataTable()); //Step 2: Apply the modifiers of the query to the result table describeResult.DescribeResults = RDFDescribeQueryEngine.ApplyModifiers(this, describeResultTable); } } return describeResult; } throw new RDFQueryException("Cannot execute DESCRIBE query because given \"store\" parameter is null."); }
/// <summary> /// Applies the query to the given federation /// </summary> public RDFDescribeQueryResult ApplyToFederation(RDFFederation federation) { if (federation != null) { this.PatternGroupResultTables.Clear(); this.PatternResultTables.Clear(); RDFDescribeQueryResult describeResult = new RDFDescribeQueryResult(this.ToString()); if (!this.IsEmpty) { //Iterate the pattern groups of the query var fedPatternResultTables = new Dictionary <RDFPatternGroup, List <DataTable> >(); foreach (RDFPatternGroup patternGroup in this.PatternGroups) { #region TrueFederations foreach (RDFStore store in federation.Stores.Values) { //Step 1: Evaluate the patterns of the current pattern group on the current store RDFDescribeQueryEngine.EvaluatePatterns(this, patternGroup, store); //Step 2: Federate the patterns of the current pattern group on the current store if (!fedPatternResultTables.ContainsKey(patternGroup)) { fedPatternResultTables.Add(patternGroup, this.PatternResultTables[patternGroup]); } else { fedPatternResultTables[patternGroup].ForEach(fprt => fprt.Merge(this.PatternResultTables[patternGroup].Single(prt => prt.TableName.Equals(fprt.TableName, StringComparison.Ordinal)), true, MissingSchemaAction.Add)); } } this.PatternResultTables[patternGroup] = fedPatternResultTables[patternGroup]; #endregion //Step 3: Get the result table of the current pattern group RDFDescribeQueryEngine.CombinePatterns(this, patternGroup); //Step 4: Apply the filters of the current pattern group to its result table RDFDescribeQueryEngine.ApplyFilters(this, patternGroup); } //Step 5: Get the result table of the query DataTable queryResultTable = RDFQueryEngine.CombineTables(this.PatternGroupResultTables.Values.ToList <DataTable>(), false); //Step 6: Describe the terms on each store and merge them in the federated result table DataTable describeResultTable = new DataTable(this.ToString()); foreach (RDFStore store in federation.Stores.Values) { describeResultTable.Merge(RDFDescribeQueryEngine.DescribeTerms(this, store, queryResultTable), true, MissingSchemaAction.Add); } //Step 7: Apply the modifiers of the query to the result table describeResult.DescribeResults = RDFDescribeQueryEngine.ApplyModifiers(this, describeResultTable); } else { //In this case the only chance to proceed is to have resources in the describe terms, //which will be used to search for S-P-O data. Variables are ignored in this scenario. if (this.DescribeTerms.Any(dt => dt is RDFResource)) { //Step 1: Describe the terms on each store and merge them in the federated result table DataTable describeResultTable = new DataTable(this.ToString()); foreach (RDFStore store in federation.Stores.Values) { describeResultTable.Merge(RDFDescribeQueryEngine.DescribeTerms(this, store, new DataTable()), true, MissingSchemaAction.Add); } //Step 2: Apply the modifiers of the query to the result table describeResult.DescribeResults = RDFDescribeQueryEngine.ApplyModifiers(this, describeResultTable); } } return(describeResult); } throw new RDFQueryException("Cannot execute DESCRIBE query because given \"federation\" parameter is null."); }
/// <summary> /// Applies the query to the given datasource /// </summary> internal RDFDescribeQueryResult ApplyToDataSource(RDFDataSource datasource) { this.PatternGroupResultTables.Clear(); this.PatternResultTables.Clear(); RDFDescribeQueryResult describeResult = new RDFDescribeQueryResult(this.ToString()); if (this.PatternGroups.Any()) { //Iterate the pattern groups of the query var fedPatternResultTables = new Dictionary <RDFPatternGroup, List <DataTable> >(); foreach (var patternGroup in this.PatternGroups) { //Step 1: Get the intermediate result tables of the current pattern group if (datasource.IsFederation()) { #region TrueFederations foreach (var store in (RDFFederation)datasource) { //Step FED.1: Evaluate the patterns of the current pattern group on the current store RDFQueryEngine.EvaluatePatterns(this, patternGroup, store); //Step FED.2: Federate the patterns of the current pattern group on the current store if (!fedPatternResultTables.ContainsKey(patternGroup)) { fedPatternResultTables.Add(patternGroup, this.PatternResultTables[patternGroup]); } else { fedPatternResultTables[patternGroup].ForEach(fprt => fprt.Merge(this.PatternResultTables[patternGroup].Single(prt => prt.TableName.Equals(fprt.TableName, StringComparison.Ordinal)), true, MissingSchemaAction.Add)); } } this.PatternResultTables[patternGroup] = fedPatternResultTables[patternGroup]; #endregion } else { RDFQueryEngine.EvaluatePatterns(this, patternGroup, datasource); } //Step 2: Get the result table of the current pattern group RDFQueryEngine.CombinePatterns(this, patternGroup); //Step 3: Apply the filters of the current pattern group to its result table RDFQueryEngine.ApplyFilters(this, patternGroup); } //Step 4: Get the result table of the query DataTable queryResultTable = RDFQueryEngine.CombineTables(this.PatternGroupResultTables.Values.ToList(), false); //Step 5: Describe the terms from the result table DataTable describeResultTable = new DataTable(this.ToString()); if (datasource.IsFederation()) { #region TrueFederations foreach (var store in (RDFFederation)datasource) { describeResultTable.Merge(RDFQueryEngine.DescribeTerms(this, store, queryResultTable), true, MissingSchemaAction.Add); } #endregion } else { describeResultTable = RDFQueryEngine.DescribeTerms(this, datasource, queryResultTable); } //Step 6: Apply the modifiers of the query to the result table describeResult.DescribeResults = RDFQueryEngine.ApplyModifiers(this, describeResultTable); } else { //In this case the only chance to proceed is to have resources in the describe terms, //which will be used to search for S-P-O data. Variables are ignored in this scenario. if (this.DescribeTerms.Any(dt => dt is RDFResource)) { //Step 1: Describe the terms from the result table DataTable describeResultTable = new DataTable(this.ToString()); if (datasource.IsFederation()) { #region TrueFederations foreach (var store in (RDFFederation)datasource) { describeResultTable.Merge(RDFQueryEngine.DescribeTerms(this, store, new DataTable()), true, MissingSchemaAction.Add); } #endregion } else { describeResultTable = RDFQueryEngine.DescribeTerms(this, datasource, new DataTable()); } //Step 2: Apply the modifiers of the query to the result table describeResult.DescribeResults = RDFQueryEngine.ApplyModifiers(this, describeResultTable); } } return(describeResult); }