public void WhereResourceOfType(SparqlVariable s, Type type) { RdfClassAttribute t = type.TryGetCustomAttribute <RdfClassAttribute>(); if (t != null) { Uri a = new Uri("http://www.w3.org/1999/02/22-rdf-syntax-ns#type"); PatternBuilder.Where(e => e.Subject(s).PredicateUri(a).Object(t.MappedUri)); } }
public void WhereResourceNotOfType(SparqlVariable s, Type type) { RdfClassAttribute t = type.TryGetCustomAttribute <RdfClassAttribute>(); if (t != null) { Uri a = new Uri("http://www.w3.org/1999/02/22-rdf-syntax-ns#type"); SparqlVariable o = VariableGenerator.CreateObjectVariable(); ConstantExpression c = Expression.Constant(t.MappedUri); PatternBuilder.Where(e => e.Subject(s).PredicateUri(a).Object(o)); PatternBuilder.Filter(e => e.Variable(o.Name) != c.AsIriExpression() || !e.Bound(o.Name)); } }
public override void SetObjectOperator(ResultOperatorBase resultOperator) { base.SetObjectOperator(resultOperator); if (ObjectVariable != null) { if (resultOperator is AnyResultOperator) { // When using x.Any(), we add a LIMIT 1 the query results in the SparqlQueryGenerator. // When using .Any(x => ..), the variable x is locally scoped and cannot be // used in outer queries. Therefore do not need to actually select it. // This avoids issues with Stardog: // https://community.stardog.com/t/sparql-union-only-working-with-inferencing-enabled/1040/9 } else if (resultOperator is AverageResultOperator) { var aggregate = new AverageAggregate(new VariableTerm(ObjectVariable.Name)); SetObjectVariable(aggregate.AsSparqlVariable(), true); } else if (resultOperator is CountResultOperator) { var aggregate = new CountDistinctAggregate(new VariableTerm(ObjectVariable.Name)); SetObjectVariable(aggregate.AsSparqlVariable(), true); } else if (resultOperator is FirstResultOperator) { // "Using LIMIT and OFFSET to select different subsets of the query solutions // will not be useful unless the order is made predictable by using ORDER BY." // Source: https://www.w3.org/TR/2013/REC-sparql11-query-20130321/#modOffset // Therefore, if no ordering exists we add an ordering on the current subject // to make the query result predictable. if (!QueryModel.BodyClauses.OfType <OrderByClause>().Any()) { OrderBy(SubjectVariable); } else { // In case the order was make explicit, we have to do nothing. } Limit(1); } else if (resultOperator is LastResultOperator) { // "Using LIMIT and OFFSET to select different subsets of the query solutions // will not be useful unless the order is made predictable by using ORDER BY." // Source: https://www.w3.org/TR/2013/REC-sparql11-query-20130321/#modOffset // Therefore, if no ordering exists we add an ordering on the current subject // to make the query result predictable. if (!QueryModel.BodyClauses.OfType <OrderByClause>().Any()) { OrderByDescending(SubjectVariable); } else { // Inverting the direction of the first ordering is handled in SparqlQueryModelVisitor.VisitOrdering(). // This is because the orderings are not necessarily processed *before* the result operators.. } Limit(1); } else if (resultOperator is MaxResultOperator) { var aggregate = new MaxAggregate(new VariableTerm(ObjectVariable.Name)); SetObjectVariable(aggregate.AsSparqlVariable(), true); } else if (resultOperator is MinResultOperator) { var aggregate = new MinAggregate(new VariableTerm(ObjectVariable.Name)); SetObjectVariable(aggregate.AsSparqlVariable(), true); } else if (resultOperator is SumResultOperator) { var aggregate = new SumAggregate(new VariableTerm(ObjectVariable.Name)); SetObjectVariable(aggregate.AsSparqlVariable(), true); } else if (resultOperator is OfTypeResultOperator) { OfTypeResultOperator ofType = resultOperator as OfTypeResultOperator; RdfClassAttribute type = ofType.SearchedItemType.TryGetCustomAttribute <RdfClassAttribute>(); if (type == null) { throw new ArgumentException("No RdfClass attrribute declared on type: " + ofType.SearchedItemType); } SparqlVariable s = ObjectVariable; SparqlVariable p = VariableGenerator.CreatePredicateVariable(); SparqlVariable o = VariableGenerator.CreateObjectVariable(); WhereResource(s, p, o); WhereResourceOfType(o, ofType.SearchedItemType); } else if (resultOperator is SkipResultOperator) { SkipResultOperator op = resultOperator as SkipResultOperator; Offset(int.Parse(op.Count.ToString())); } else if (resultOperator is TakeResultOperator) { TakeResultOperator op = resultOperator as TakeResultOperator; Limit(int.Parse(op.Count.ToString())); } else { throw new NotImplementedException(resultOperator.ToString()); } } }