private ISparqlExpression BuildSparqlFilter(SingleValueNode filterNode, string suffix = "") { NodeFactory nodeFactory = new NodeFactory(); if (filterNode.GetType() == typeof(SingleValueFunctionCallNode)) { return(BuildFunctionExpression(filterNode as SingleValueFunctionCallNode)); } else if (filterNode.GetType() == typeof(SingleValuePropertyAccessNode)) { return(new VariableTerm($"?{(filterNode as SingleValuePropertyAccessNode).Property.Name}{suffix}")); } else if (filterNode.GetType() == typeof(ConstantNode)) { return(new ConstantTerm(CreateLiteralNode(filterNode as ConstantNode))); } else if (filterNode.GetType() == typeof(ConvertNode)) { var convert = filterNode as ConvertNode; if (convert.Source is SingleValueFunctionCallNode) { return(BuildSparqlFilter(convert.Source as SingleValueFunctionCallNode, suffix)); } else if (convert.Source is ConstantNode) { return(new ConstantTerm(CreateLiteralNode(convert.Source as ConstantNode))); } else if (convert.Source is SingleValuePropertyAccessNode) { var varName = (convert.Source as SingleValuePropertyAccessNode).Property.Name; if (varName.ToLower() == "localid") { var node = LiteralExtensions.ToLiteral(NamespaceUri.ToString().Length + 1, nodeFactory); varName = EdmNodeList[EdmNodeList.Count - 1].Name; return((new UnaryExpressionFilter( new SubStrFunction(new StrFunction(new VariableTerm($"?{varName}{suffix}")), (new ConstantTerm(node))))).Expression); } else { return(new VariableTerm($"?{varName}{suffix}")); } } } else if (filterNode.GetType() == typeof(BinaryOperatorNode)) { var binaryOperator = filterNode as BinaryOperatorNode; var left = BuildSparqlFilter(binaryOperator.Left, suffix); var right = BuildSparqlFilter(binaryOperator.Right, suffix); if (binaryOperator.OperatorKind == BinaryOperatorKind.And) { return(new AndExpression(left, right)); } else if (binaryOperator.OperatorKind == BinaryOperatorKind.Or) { return(new OrExpression(left, right)); } else if (binaryOperator.OperatorKind == BinaryOperatorKind.Equal) { return(new EqualsExpression(left, right)); } else if (binaryOperator.OperatorKind == BinaryOperatorKind.NotEqual) { return(new NotEqualsExpression(left, right)); } else if (binaryOperator.OperatorKind == BinaryOperatorKind.GreaterThan) { return(new GreaterThanExpression(left, right)); } else if (binaryOperator.OperatorKind == BinaryOperatorKind.GreaterThanOrEqual) { return(new GreaterThanOrEqualToExpression(left, right)); } else if (binaryOperator.OperatorKind == BinaryOperatorKind.LessThan) { return(new LessThanExpression(left, right)); } else if (binaryOperator.OperatorKind == BinaryOperatorKind.LessThanOrEqual) { return(new LessThanOrEqualToExpression(left, right)); } else if (binaryOperator.OperatorKind == BinaryOperatorKind.Add) { return(new AdditionExpression(left, right)); } else if (binaryOperator.OperatorKind == BinaryOperatorKind.Subtract) { return(new SubtractionExpression(left, right)); } else if (binaryOperator.OperatorKind == BinaryOperatorKind.Divide) { return(new DivisionExpression(left, right)); } else if (binaryOperator.OperatorKind == BinaryOperatorKind.Multiply) { return(new MultiplicationExpression(left, right)); } } else if (filterNode.GetType() == typeof(UnaryOperatorNode)) { var unaryOperator = filterNode as UnaryOperatorNode; if (unaryOperator.OperatorKind == UnaryOperatorKind.Not) { return(new NotEqualsExpression(BuildSparqlFilter(unaryOperator.Operand, suffix), new ConstantTerm(LiteralExtensions.ToLiteral(true, nodeFactory)))); } } return(null); }