// TODO Should not be needed since we would rely on the underlying storage capabilities /** * Creates a new Values element. * @param model the Model to create the Values in * @param data the Table providing the actual data * @return a new Values */ public static IValues createValues(SpinProcessor model, SparqlResultSet data, bool untyped) { IResource blank = untyped ? model.CreateResource() : model.CreateResource(SP.ClassValues); IValues values = (IValues)blank.As(typeof(ValuesImpl)); List <IResource> vars = new List <IResource>(); foreach (String varName in data.Variables) { vars.Add(Resource.Get(RDFUtil.CreateLiteralNode(varName), model)); } IResource varList = model.CreateList(vars.GetEnumerator()); values.AddProperty(SP.PropertyVarNames, varList); IEnumerator <SparqlResult> bindings = data.Results.GetEnumerator(); if (bindings.MoveNext()) { List <IResource> lists = new List <IResource>(); while (bindings.MoveNext()) { List <IResource> nodes = new List <IResource>(); SparqlResult binding = bindings.Current; foreach (String varName in data.Variables) { INode value = binding.Value(varName); if (value == null) { nodes.Add(Resource.Get(SP.ClassPropertyUndef, model)); } else { nodes.Add(Resource.Get(value, model)); } } lists.Add(model.CreateList(nodes.GetEnumerator())); } values.AddProperty(SP.PropertyBindings, model.CreateList(lists.GetEnumerator())); } return(values); }