/// <summary> /// Apply the filters of the given pattern group to its result table /// </summary> internal static void ApplyFilters(RDFAskQuery query, RDFPatternGroup patternGroup) { if (patternGroup.Patterns.Any() && patternGroup.Filters.Any()) { DataTable filteredTable = query.PatternGroupResultTables[patternGroup].Clone(); IEnumerator rowsEnum = query.PatternGroupResultTables[patternGroup].Rows.GetEnumerator(); //Iterate the rows of the pattern group's result table Boolean keepRow = false; while (rowsEnum.MoveNext()) { //Apply the pattern group's filters on the row keepRow = true; IEnumerator<RDFFilter> filtersEnum = patternGroup.Filters.GetEnumerator(); while (keepRow && filtersEnum.MoveNext()) { keepRow = filtersEnum.Current.ApplyFilter((DataRow)rowsEnum.Current, false); } //If the row has passed all the filters, keep it in the filtered result table if (keepRow) { DataRow newRow = filteredTable.NewRow(); newRow.ItemArray = ((DataRow)rowsEnum.Current).ItemArray; filteredTable.Rows.Add(newRow); } } //Save the result datatable query.PatternGroupResultTables[patternGroup] = filteredTable; } }
/// <summary> /// Get the result table of the given pattern group /// </summary> internal static void CombinePatterns(RDFAskQuery query, RDFPatternGroup patternGroup) { if (patternGroup.Patterns.Any()) { //Populate pattern group result table DataTable patternGroupResultTable = RDFQueryEngine.CombineTables(query.PatternResultTables[patternGroup], false); //Add it to the list of pattern group result tables query.PatternGroupResultTables.Add(patternGroup, patternGroupResultTable); //Populate its metadata query.PatternGroupResultTables[patternGroup].TableName = patternGroup.ToString(); if (!query.PatternGroupResultTables[patternGroup].ExtendedProperties.ContainsKey("IsOptional")) { query.PatternGroupResultTables[patternGroup].ExtendedProperties.Add("IsOptional", patternGroup.IsOptional); } else { query.PatternGroupResultTables[patternGroup].ExtendedProperties["IsOptional"] = patternGroup.IsOptional; } if (!query.PatternGroupResultTables[patternGroup].ExtendedProperties.ContainsKey("JoinAsUnion")) { query.PatternGroupResultTables[patternGroup].ExtendedProperties.Add("JoinAsUnion", patternGroup.JoinAsUnion); } else { query.PatternGroupResultTables[patternGroup].ExtendedProperties["JoinAsUnion"] = patternGroup.JoinAsUnion; } } }
/// <summary> /// Apply the filters of the given pattern group to its result table /// </summary> internal static void ApplyFilters(RDFAskQuery query, RDFPatternGroup patternGroup) { if (patternGroup.Patterns.Any() && patternGroup.Filters.Any()) { DataTable filteredTable = query.PatternGroupResultTables[patternGroup].Clone(); IEnumerator rowsEnum = query.PatternGroupResultTables[patternGroup].Rows.GetEnumerator(); //Iterate the rows of the pattern group's result table Boolean keepRow = false; while (rowsEnum.MoveNext()) { //Apply the pattern group's filters on the row keepRow = true; IEnumerator <RDFFilter> filtersEnum = patternGroup.Filters.GetEnumerator(); while (keepRow && filtersEnum.MoveNext()) { keepRow = filtersEnum.Current.ApplyFilter((DataRow)rowsEnum.Current, false); } //If the row has passed all the filters, keep it in the filtered result table if (keepRow) { DataRow newRow = filteredTable.NewRow(); newRow.ItemArray = ((DataRow)rowsEnum.Current).ItemArray; filteredTable.Rows.Add(newRow); } } //Save the result datatable query.PatternGroupResultTables[patternGroup] = filteredTable; } }
/// <summary> /// Get the intermediate result tables of the given pattern group /// </summary> internal static void EvaluatePatterns(RDFAskQuery query, RDFPatternGroup patternGroup, Object graphOrStore) { query.PatternResultTables[patternGroup] = new List<DataTable>(); //Iterate over the patterns of the pattern group foreach (RDFPattern pattern in patternGroup.Patterns) { //Apply the pattern to the graph/store DataTable patternResultsTable = graphOrStore is RDFGraph ? RDFQueryEngine.ApplyPattern(pattern, (RDFGraph)graphOrStore) : RDFQueryEngine.ApplyPattern(pattern, (RDFStore)graphOrStore); //Set the name and the optionality metadata of the result datatable patternResultsTable.TableName = pattern.ToString(); patternResultsTable.ExtendedProperties.Add("IsOptional", pattern.IsOptional); patternResultsTable.ExtendedProperties.Add("JoinAsUnion", pattern.JoinAsUnion); //Save the result datatable query.PatternResultTables[patternGroup].Add(patternResultsTable); } }
/// <summary> /// Get the intermediate result tables of the given pattern group /// </summary> internal static void EvaluatePatterns(RDFAskQuery query, RDFPatternGroup patternGroup, Object graphOrStore) { query.PatternResultTables[patternGroup] = new List <DataTable>(); //Iterate over the patterns of the pattern group foreach (RDFPattern pattern in patternGroup.Patterns) { //Apply the pattern to the graph/store DataTable patternResultsTable = graphOrStore is RDFGraph?RDFQueryEngine.ApplyPattern(pattern, (RDFGraph)graphOrStore) : RDFQueryEngine.ApplyPattern(pattern, (RDFStore)graphOrStore); //Set the name and the optionality metadata of the result datatable patternResultsTable.TableName = pattern.ToString(); patternResultsTable.ExtendedProperties.Add("IsOptional", pattern.IsOptional); patternResultsTable.ExtendedProperties.Add("JoinAsUnion", pattern.JoinAsUnion); //Save the result datatable query.PatternResultTables[patternGroup].Add(patternResultsTable); } }
/// <summary> /// Prints the string representation of a SPARQL ASK query /// </summary> internal static String PrintAskQuery(RDFAskQuery askQuery) { StringBuilder sb = new StringBuilder(); if (askQuery != null) { #region PREFIXES if (askQuery.Prefixes.Any()) { askQuery.Prefixes.ForEach(pf => { sb.Append("PREFIX " + pf.NamespacePrefix + ": <" + pf.NamespaceUri + ">\n"); }); sb.Append("\n"); } #endregion #region HEADER #region BEGINASK sb.Append("ASK"); #endregion #endregion #region BODY sb.Append("\nWHERE {\n"); #region MEMBERS Boolean printingUnion = false; List <RDFQueryMember> evaluableQueryMembers = askQuery.GetEvaluableQueryMembers().ToList(); RDFQueryMember lastQueryMbr = evaluableQueryMembers.LastOrDefault(); foreach (var queryMember in evaluableQueryMembers) { #region PATTERNGROUPS if (queryMember is RDFPatternGroup) { //Current pattern group is set as UNION with the next one if (((RDFPatternGroup)queryMember).JoinAsUnion) { //Current pattern group IS NOT the last of the query //(so UNION keyword must be appended at last) if (!queryMember.Equals(lastQueryMbr)) { //Begin a new Union block if (!printingUnion) { printingUnion = true; sb.Append(" {\n"); } sb.Append(PrintPatternGroup((RDFPatternGroup)queryMember, 2, true, askQuery.Prefixes)); sb.Append(" UNION\n"); } //Current pattern group IS the last of the query //(so UNION keyword must not be appended at last) else { //End the Union block if (printingUnion) { printingUnion = false; sb.Append(PrintPatternGroup((RDFPatternGroup)queryMember, 2, true, askQuery.Prefixes)); sb.Append(" }\n"); } else { sb.Append(PrintPatternGroup((RDFPatternGroup)queryMember, 0, false, askQuery.Prefixes)); } } } //Current pattern group is set as INTERSECT with the next one else { //End the Union block if (printingUnion) { printingUnion = false; sb.Append(PrintPatternGroup((RDFPatternGroup)queryMember, 2, true, askQuery.Prefixes)); sb.Append(" }\n"); } else { sb.Append(PrintPatternGroup((RDFPatternGroup)queryMember, 0, false, askQuery.Prefixes)); } } } #endregion #region SUBQUERY else if (queryMember is RDFQuery) { //Merge main query prefixes askQuery.Prefixes.ForEach(pf1 => { if (!((RDFSelectQuery)queryMember).Prefixes.Any(pf2 => pf2.Equals(pf1))) { ((RDFSelectQuery)queryMember).AddPrefix(pf1); } }); //Current subquery is set as UNION with the next one if (((RDFSelectQuery)queryMember).JoinAsUnion) { //Current subquery IS NOT the last of the query //(so UNION keyword must be appended at last) if (!queryMember.Equals(lastQueryMbr)) { //Begin a new Union block if (!printingUnion) { printingUnion = true; sb.Append(" {\n"); } sb.Append(PrintSelectQuery((RDFSelectQuery)queryMember, 1, true)); sb.Append(" UNION\n"); } //Current query IS the last of the query //(so UNION keyword must not be appended at last) else { //End the Union block if (printingUnion) { printingUnion = false; sb.Append(PrintSelectQuery((RDFSelectQuery)queryMember, 1, true)); sb.Append(" }\n"); } else { sb.Append(PrintSelectQuery((RDFSelectQuery)queryMember, 1, false)); } } } //Current query is set as INTERSECT with the next one else { //End the Union block if (printingUnion) { printingUnion = false; sb.Append(PrintSelectQuery((RDFSelectQuery)queryMember, 1, true)); sb.Append(" }\n"); } else { sb.Append(PrintSelectQuery((RDFSelectQuery)queryMember, 1, false)); } } } #endregion } #endregion sb.Append("}"); #endregion } return(sb.ToString()); }