protected override String RunTaskInternal() { // Start from an initial Original Query issued by user SparqlQuery initialQuery; try { initialQuery = this._parser.ParseFromString(this.OriginalQueryString); } catch (RdfParseException parseEx) { throw new RdfQueryException("Unable to parse the given SPARQL Query", parseEx); } if (initialQuery.QueryType != SparqlQueryType.Select && initialQuery.QueryType != SparqlQueryType.SelectDistinct) { throw new RdfQueryException("Only Sparql select Query with variables is supported for table format"); } INamespaceMapper originalPrefixes = new NamespaceMapper(true); originalPrefixes.Import(initialQuery.NamespaceMap); initialQuery.NamespaceMap.Clear(); // Get the predicates for first variable (entity subjects) // SELECT DISTINCT ?p (COUNT(?p) as ?count) // WHERE // { // { // # Original Query // } // ?sx ?p ?o. // } // GROUP BY ?p // Create a dynamic originalQuery SparqlVariable subject = initialQuery.Variables.FirstOrDefault(v => v.IsResultVariable); if (subject == null) { throw new RdfQueryException("At least one result variable is required to generate an entities query"); } INode subjectNode = this._nodeFactory.CreateVariableNode(subject.Name); SparqlParameterizedString getPredicatesQuery = new SparqlParameterizedString(); getPredicatesQuery.Namespaces = originalPrefixes; getPredicatesQuery.CommandText = @" SELECT DISTINCT ?p (COUNT(?p) as ?count) WHERE {"; getPredicatesQuery.AppendSubQuery(initialQuery); getPredicatesQuery.CommandText += @" @subject ?p ?o. } GROUP BY ?p"; getPredicatesQuery.SetParameter("subject", subjectNode); try { // Get predicates and number of usages this.Information = "Running query to extract predicates for entities selected by original query..."; SparqlResultSet sparqlResults = (SparqlResultSet)this._storage.Query(getPredicatesQuery.ToString()); if (sparqlResults == null) { throw new RdfQueryException("Unexpected results type received while trying to build entities query"); } List <String> selectColumns = new List <String>(); selectColumns.Add(subject.Name); SparqlParameterizedString entitiesQuery = new SparqlParameterizedString(); entitiesQuery.Namespaces.Import(getPredicatesQuery.Namespaces); entitiesQuery.SetParameter("subject", subjectNode); // For each predicate add a column and an appropriate OPTIONAL clause int predicateIndex = 0; StringBuilder optionalFilters = new StringBuilder(); this.Information = "Generating Entities Query..."; foreach (SparqlResult sparqlResult in sparqlResults) { if (!sparqlResult.HasBoundValue("p")) { continue; } INode predicate = sparqlResult["p"]; IValuedNode count = sparqlResult["count"].AsValuedNode(); long predicateCount = count != null?count.AsInteger() : 0; // For each predicate with predicateCount > _minValuesPerPredicateLimit add a new column and an optional filter in where clause if (predicateCount <= _minValuesPerPredicateLimit) { continue; } predicateIndex++; String predicateColumnName = GetColumnName(predicate, entitiesQuery.Namespaces); if (predicateColumnName == null) { continue; } selectColumns.Add(predicateColumnName); optionalFilters.AppendLine(" OPTIONAL { @subject @predicate" + predicateIndex + " ?" + predicateColumnName + " }"); entitiesQuery.SetParameter("predicate" + predicateIndex, predicate); } if (selectColumns.Count == 1) { throw new RdfQueryException("No predicates which matched the criteria were found so an entities query cannot be generated"); } entitiesQuery.CommandText = "SELECT DISTINCT "; foreach (String column in selectColumns) { entitiesQuery.CommandText += "?" + column + " "; } entitiesQuery.CommandText += @" WHERE { "; entitiesQuery.AppendSubQuery(initialQuery); entitiesQuery.CommandText += optionalFilters.ToString(); entitiesQuery.CommandText += @" }"; this.Information = "Generated Entities Query with " + (selectColumns.Count - 1) + " Predicate Columns"; this.OutputTableQuery = entitiesQuery.ToString(); } catch (Exception) { this.OutputTableQuery = null; throw; } return(this.OutputTableQuery); }