private static void AddTriplePattern(this IGraphPatternBuilder builder, Triple t) { builder .Where(tripleBuilder => tripleBuilder .Subject(t.Subject) .PredicateUri(t.Predicate as IUriNode) .Object(t.Object)); }
private void BuildMemberAccess(MemberExpression memberExpression, IGraphPatternBuilder patternBuilder, MemberInfo member, SparqlVariable s, SparqlVariable o) { RdfPropertyAttribute p = memberExpression.TryGetRdfPropertyAttribute(); if (p == null) { throw new Exception(string.Format("No RdfPropertyAttribute found for member: {0}", member.Name)); } // Invoke the final user-handled member access triple builder callback. patternBuilder.Where(t => t.Subject(s).PredicateUri(p.MappedUri).Object(o)); }
private SparqlVariable BuildMemberAccess(MemberExpression memberExpression, IGraphPatternBuilder patternBuilder) { MemberInfo member = memberExpression.Member; // If we do access a member of a system type, like string.Length we actually select the // the declaring member and invoke a SPARQL built in call to get the value. if (member.IsBuiltInCall()) { MemberExpression parentMember = memberExpression.Expression as MemberExpression; return(BuildMemberAccess(parentMember, patternBuilder)); } else if (memberExpression.Expression is MemberExpression) { MemberExpression parentMember = memberExpression.Expression as MemberExpression; // Note: When we build an optional property path, we consider the relation to the // parent properties of the accessed property to be non-optional. IGraphPatternBuilder builder = member.IsUriType() ? patternBuilder : PatternBuilder; // We might encounter property paths (i.e. contact.Organization.Name). Therefore, // implement the parent expression of the current member recursively.. SparqlVariable po = BuildMemberAccess(parentMember, builder); // If we are building a node on a property path (parentExpression != null), we associate // the object variable with the parent expression so that it becomes the subject of the parent. VariableGenerator.SetSubjectVariable(memberExpression, po); } if (member.IsUriType()) { // When we access the .Uri member of a resource we do not need a property mapping and return the subject as the bound variable. // We create a triple pattern describing the resource in the local scope just in case it has not been described yet. // Todo: Improve. Check if triples actually need to be asserted. SparqlVariable s = VariableGenerator.TryGetSubjectVariable(memberExpression) ?? SubjectVariable; SparqlVariable p = VariableGenerator.CreatePredicateVariable(); SparqlVariable o = VariableGenerator.CreateObjectVariable(memberExpression); patternBuilder.Where(t => t.Subject(s).Predicate(p).Object(o)); VariableGenerator.SetSubjectVariable(memberExpression, s); return(s); } else if (memberExpression.Expression is QuerySourceReferenceExpression) { QuerySourceReferenceExpression querySource = memberExpression.Expression as QuerySourceReferenceExpression; if (VariableGenerator.TryGetSubjectVariable(memberExpression) == VariableGenerator.GlobalSubject) { // In case the accessed member is the global query subject (i.e. from x select x.Y).. SparqlVariable s = VariableGenerator.TryGetSubjectVariable(querySource); SparqlVariable o = VariableGenerator.GlobalSubject; if (s == null) { s = VariableGenerator.CreateSubjectVariable(querySource); BuildMemberAccess(memberExpression, patternBuilder, member, s, o); } return(o); } else { // Otherwise we are accessing a member of the globale query subject (i.e. from x where x.Y select x) SparqlVariable s = VariableGenerator.TryGetSubjectVariable(querySource) ?? VariableGenerator.GlobalSubject; SparqlVariable o = VariableGenerator.TryGetObjectVariable(memberExpression) ?? VariableGenerator.CreateObjectVariable(memberExpression); BuildMemberAccess(memberExpression, patternBuilder, member, s, o); return(o); } } else { SparqlVariable s = VariableGenerator.TryGetSubjectVariable(memberExpression) ?? VariableGenerator.CreateSubjectVariable(memberExpression); SparqlVariable o = VariableGenerator.TryGetObjectVariable(memberExpression) ?? VariableGenerator.CreateObjectVariable(memberExpression); BuildMemberAccess(memberExpression, patternBuilder, member, s, o); return(o); } }