private IEnumerable <Triple> GetTriplesForDataObject(string identity)
        {
            var queryContext = new SparqlQueryContext(string.Format(QueryTemplate, identity));

            queryContext.SparqlResultsFormat = SparqlResultsFormat.Xml;
            queryContext.GraphResultsFormat  = RdfFormat.NTriples;
            var results = Client.ExecuteQuery(queryContext, DataSetGraphUris);

            foreach (var row in results.ResultSet)
            {
                // create new triple
                var triple = new Triple
                {
                    Subject   = identity,
                    Graph     = row["g"].ToString(),
                    Predicate = row["p"].ToString()
                };

                var literal = row["o"] as ILiteralNode;
                if (literal != null)
                {
                    var dt = literal.DataType?.ToString();
                    triple.LangCode  = literal.Language;
                    triple.DataType  = dt ?? RdfDatatypes.String;
                    triple.Object    = literal.Value;
                    triple.IsLiteral = true;
                }
                else
                {
                    triple.Object = row["o"].ToString().Trim();
                }
                yield return(triple);
            }
        }
Ejemplo n.º 2
0
 private static string FormatDeletePattern(Triple p, ref int propId)
 {
     return(String.Format(" {0} {1} {2} .",
                          FormatDeletePatternItem(p.Subject, ref propId),
                          FormatDeletePatternItem(p.Predicate, ref propId),
                          p.IsLiteral
                              ? FormatDeletePatternItem(p.Object, p.DataType, p.LangCode)
                              : FormatDeletePatternItem(p.Object, ref propId)));
 }
        private static Triple MakeTriple(INode subjectNode, INode predicateNode, INode objectNode)
        {
            var litNode = objectNode as ILiteralNode;
            var t       = new Triple
            {
                Subject   = subjectNode.ToString(),
                Predicate = predicateNode.ToString(),
                IsLiteral = objectNode is ILiteralNode,
                Object    = litNode != null ? litNode.Value : objectNode.ToString()
            };

            if (litNode == null)
            {
                return(t);
            }
            t.DataType = litNode?.DataType?.ToString() ?? Constants.DefaultDatatypeUri;
            t.LangCode = litNode?.Language;
            return(t);
        }
        //private string FormatDeletePatterns(IEnumerable<Triple> deletePatterns)
        //{
        //    int propId = 0;
        //    var deleteOp = new StringBuilder();
        //    deleteOp.AppendLine("DELETE {");
        //    foreach (var deleteGraphGroup in deletePatterns.GroupBy(d => d.Graph))
        //    {
        //        deleteOp.AppendFormat("GRAPH <{0}> {{", deleteGraphGroup.Key);
        //        deleteOp.AppendLine();
        //        foreach (var deletePattern in deleteGraphGroup)
        //        {
        //            if (deletePattern.Predicate.Equals(Constants.WildcardUri))
        //            {
        //                deleteOp.AppendFormat("  <{0}> ?d{1} ?d{2} .", deletePattern.Subject, propId++, propId++);
        //            }
        //            else if (!deletePattern.IsLiteral && deletePattern.Object.Equals(Constants.WildcardUri))
        //            {
        //                deleteOp.AppendFormat("  <{0}> <{1}> ?d{2} .", deletePattern.Subject, deletePattern.Predicate,
        //                                      propId++);
        //            }
        //            else
        //            {
        //                AppendTriplePattern(deletePattern, deleteOp);

        //            }
        //            deleteOp.AppendLine();
        //        }
        //        deleteOp.AppendLine("}");
        //    }
        //    deleteOp.AppendLine("}");
        //    return deleteOp.ToString();
        //}

        private void AppendTriplePattern(Triple triple, StringBuilder builder)
        {
            builder.AppendFormat("  <{0}> <{1}> ", triple.Subject, triple.Predicate);
            if (triple.IsLiteral)
            {
                builder.AppendFormat("\"{0}\"", triple.Object);
                if (triple.DataType != null)
                {
                    builder.Append("^^");
                    builder.AppendFormat("<{0}>", triple.DataType);
                }
                if (triple.LangCode != null)
                {
                    builder.Append("@");
                    builder.Append(triple.LangCode);
                }
            }
            else
            {
                builder.AppendFormat("<{0}>", triple.Object);
            }
            builder.Append(" .");
        }
Ejemplo n.º 5
0
        //private string FormatDeletePatterns(IEnumerable<Triple> deletePatterns)
        //{
        //    int propId = 0;
        //    var deleteOp = new StringBuilder();
        //    deleteOp.AppendLine("DELETE {");
        //    foreach (var deleteGraphGroup in deletePatterns.GroupBy(d => d.Graph))
        //    {
        //        deleteOp.AppendFormat("GRAPH <{0}> {{", deleteGraphGroup.Key);
        //        deleteOp.AppendLine();
        //        foreach (var deletePattern in deleteGraphGroup)
        //        {
        //            if (deletePattern.Predicate.Equals(Constants.WildcardUri))
        //            {
        //                deleteOp.AppendFormat("  <{0}> ?d{1} ?d{2} .", deletePattern.Subject, propId++, propId++);
        //            }
        //            else if (!deletePattern.IsLiteral && deletePattern.Object.Equals(Constants.WildcardUri))
        //            {
        //                deleteOp.AppendFormat("  <{0}> <{1}> ?d{2} .", deletePattern.Subject, deletePattern.Predicate,
        //                                      propId++);
        //            }
        //            else
        //            {
        //                AppendTriplePattern(deletePattern, deleteOp);
                        
        //            }
        //            deleteOp.AppendLine();
        //        }
        //        deleteOp.AppendLine("}");
        //    }
        //    deleteOp.AppendLine("}");
        //    return deleteOp.ToString();
        //}

        private void AppendTriplePattern(Triple triple, StringBuilder builder)
        {
            builder.AppendFormat("  <{0}> <{1}> ", triple.Subject, triple.Predicate);
            if (triple.IsLiteral)
            {
                builder.AppendFormat("\"{0}\"", triple.Object);
                if (triple.DataType != null)
                {
                    builder.Append("^^");
                    builder.AppendFormat("<{0}>", triple.DataType);
                }
                if (triple.LangCode != null)
                {
                    builder.Append("@");
                    builder.Append(triple.LangCode);
                }
            }
            else
            {
                builder.AppendFormat("<{0}>", triple.Object);
            }
            builder.Append(" .");
        }
Ejemplo n.º 6
0
 /// <summary>
 /// Determines if the specified triple consists of a grounded (non-wildcard)
 /// subject, predicate and object.
 /// </summary>
 /// <param name="t">The triple to check</param>
 /// <returns></returns>
 private static bool IsGrounded(Triple t)
 {
     return (t.Predicate != Constants.WildcardUri) && (t.Object != Constants.WildcardUri);
 }
Ejemplo n.º 7
0
 /// <summary>
 /// Determines if the specified triple is targeted at a specific graph
 /// </summary>
 /// <param name="t">The triple to check</param>
 /// <returns></returns>
 private static bool IsGraphTargeted(Triple t)
 {
     return t.Graph != null && t.Graph != Constants.WildcardUri;
 }
Ejemplo n.º 8
0
 private static string FormatDeletePattern(Triple p, ref int propId)
 {
     return String.Format(" {0} {1} {2} .",
                          FormatDeletePatternItem(p.Subject, ref propId),
                          FormatDeletePatternItem(p.Predicate, ref propId),
                          p.IsLiteral
                              ? FormatDeletePatternItem(p.Object, p.DataType, p.LangCode)
                              : FormatDeletePatternItem(p.Object, ref propId));
 }
Ejemplo n.º 9
0
        private IEnumerable<Triple> GetTriplesForDataObject(string identity)
        {
            var queryContext = new SparqlQueryContext(string.Format(QueryTemplate, identity));
            queryContext.SparqlResultsFormat = SparqlResultsFormat.Xml;
            queryContext.GraphResultsFormat = RdfFormat.NTriples;
            var results = Client.ExecuteQuery(queryContext, DataSetGraphUris);
            foreach(var row in results.ResultSet)
            {
                // create new triple
                var triple = new Triple
                {
                    Subject = identity,
                    Graph = row["g"].ToString(),
                    Predicate = row["p"].ToString()
                };

                var literal = row["o"] as ILiteralNode;
                if (literal != null)
                {
                    var dt = literal.DataType?.ToString();
                    triple.LangCode = literal.Language;
                    triple.DataType = dt ?? RdfDatatypes.String;
                    triple.Object = literal.Value;
                    triple.IsLiteral = true;
                }
                else
                {
                    triple.Object = row["o"].ToString().Trim();
                }
                yield return triple;
            }
        }
Ejemplo n.º 10
0
 /// <summary>
 /// Determines if the specified triple consists of a grounded (non-wildcard)
 /// subject, predicate and object.
 /// </summary>
 /// <param name="t">The triple to check</param>
 /// <returns></returns>
 private static bool IsGrounded(Triple t)
 {
     return((t.Predicate != Constants.WildcardUri) && (t.Object != Constants.WildcardUri));
 }
Ejemplo n.º 11
0
 /// <summary>
 /// Determines if the specified triple is targeted at a specific graph
 /// </summary>
 /// <param name="t">The triple to check</param>
 /// <returns></returns>
 private static bool IsGraphTargeted(Triple t)
 {
     return(t.Graph != null && t.Graph != Constants.WildcardUri);
 }
Ejemplo n.º 12
0
 private static string FormatDeletePattern(Triple p, ref int propId)
 {
     return(p.Predicate.Equals(Constants.WildcardUri)
                ? String.Format("  <{0}> ?d{1} ?d{2} .", p.Subject, propId++, propId++)
                : String.Format("  <{0}> <{1}> ?d{2} .", p.Subject, p.Predicate, propId++));
 }
        public IEnumerable<IDataObject> BindDataObjects(XmlReader xmlReader, bool resultsAreOrdered = false)
        {
            var variables = new List<string>();
            var xmlResultNodeTripleValues = new List<string>();
            bool readingResults = false;
            var resourceTriples = new Dictionary<string, List<Triple>>();
            string lastLoadedSubject = null; //if resultsAreOrdered then once we get a new subject we can create the DataObject

            while (xmlReader.Read())
            {
                if (xmlReader.NamespaceURI.Equals("http://www.w3.org/2005/sparql-results#")
                    && xmlReader.NodeType == XmlNodeType.Element)
                {
                    var nodeName = xmlReader.Name.ToLower();
                    if (!readingResults) //header part
                    {
                        if (nodeName.Equals("variable"))
                        {
                            variables.Add(xmlReader.GetAttribute("name"));
                            continue;
                        }
                        else if (nodeName.Equals("results"))
                        {
                            readingResults = true;
                            if (variables.Count != 1 && variables.Count != 3)
                            {
                                throw new NotSupportedException("Sparql results can be a list of id's(1 variable) or a list of triples(3 variables). Variables found:" + variables.Count);
                            }
                            continue;
                        }
                    }
                    else //reading results
                    {
                        if (variables.Count == 1) //load id's
                        {
                            if (nodeName.Equals("uri"))
                            {
                                string uri = null;
                                try
                                {
                                    uri = xmlReader.ReadElementContentAsString();
                                }
                                catch (Exception ex)
                                {
                                    Logging.LogError(BrightstarEventId.ClientDataBindError,
                                        "Error binding to SPARQL results element. {0}", ex);
                                }
                                if (!String.IsNullOrEmpty(uri))
                                {
                                    yield return _storeContext.MakeDataObject(uri);
                                }
                            }
                        }
                        else //load triples
                        {
                            var isUri = nodeName.Equals("uri");
                            var isLiteral = nodeName.Equals("literal");
                            string literalDataType = null;
                            string literalLanguage = null;
                            if (isUri || isLiteral)
                            {
                                string elementContentAsString = null;
                                try
                                {
                                    literalDataType = xmlReader.GetAttribute("datatype");
                                    literalLanguage = xmlReader.GetAttribute("xml:lang");
                                    elementContentAsString = xmlReader.ReadElementContentAsString();
                                }
                                catch (Exception ex)
                                {
                                    Logging.LogError(BrightstarEventId.ClientDataBindError,
                                        "Error binding to SPARQL results element. {0}", ex);
                                }
                                if (!String.IsNullOrEmpty(elementContentAsString))
                                {
                                    xmlResultNodeTripleValues.Add(elementContentAsString);
                                }
                            }

                            //create new triple
                            if (xmlResultNodeTripleValues.Count == 3)
                            {
                                var s = xmlResultNodeTripleValues[0];

                                //if object was a literal it's the last read value => datatype, lang must match
                                var triple = new Triple
                                {
                                    Subject = s,
                                    Predicate = xmlResultNodeTripleValues[1],
                                    IsLiteral = isLiteral,
                                    Object = xmlResultNodeTripleValues[2],
                                    LangCode = literalLanguage,
                                    DataType = literalDataType ?? RdfDatatypes.String
                                };


                                if (resourceTriples.ContainsKey(s)) //resource already has triples
                                {
                                    resourceTriples[s].Add(triple);
                                }
                                else
                                {
                                    resourceTriples.Add(s, new List<Triple> { triple });
                                }

                                //if results are in order and we have new subject then we can create a new object for the previous one
                                if (resultsAreOrdered && lastLoadedSubject != null && lastLoadedSubject != s)
                                {
                                    var dataObject = _storeContext.MakeDataObject(lastLoadedSubject) as DataObject;
                                    dataObject.BindTriples(resourceTriples[lastLoadedSubject]);
                                    yield return dataObject;
                                }

                                lastLoadedSubject = s;
                                xmlResultNodeTripleValues.Clear();
                            }
                        }
                    }
                }

            }
            xmlReader.Close();


            if (resultsAreOrdered && lastLoadedSubject != null)
            {
                var dataObject = _storeContext.MakeDataObject(lastLoadedSubject) as DataObject;
                dataObject.BindTriples(resourceTriples[lastLoadedSubject]);
                yield return dataObject;
            }
            else
            {
                foreach (KeyValuePair<string, List<Triple>> resourceTriple in resourceTriples)
                {
                    var dataObject = _storeContext.MakeDataObject(resourceTriple.Key) as DataObject;
                    dataObject.BindTriples(resourceTriple.Value);

                    yield return dataObject;
                }
            }

        }
 private static string FormatDeletePattern(Triple p, ref int propId)
 {
     return p.Predicate.Equals(Constants.WildcardUri)
                ? String.Format("  <{0}> ?d{1} ?d{2} .", p.Subject, propId++, propId++)
                : String.Format("  <{0}> <{1}> ?d{2} .", p.Subject, p.Predicate, propId++);
 }
Ejemplo n.º 15
0
        public IEnumerable <IDataObject> BindDataObjects(XmlReader xmlReader, bool resultsAreOrdered = false)
        {
            var    variables = new List <string>();
            var    xmlResultNodeTripleValues = new List <string>();
            bool   readingResults            = false;
            var    resourceTriples           = new Dictionary <string, List <Triple> >();
            string lastLoadedSubject         = null; //if resultsAreOrdered then once we get a new subject we can create the DataObject

            while (xmlReader.Read())
            {
                if (xmlReader.NamespaceURI.Equals("http://www.w3.org/2005/sparql-results#") &&
                    xmlReader.NodeType == XmlNodeType.Element)
                {
                    var nodeName = xmlReader.Name.ToLower();
                    if (!readingResults) //header part
                    {
                        if (nodeName.Equals("variable"))
                        {
                            variables.Add(xmlReader.GetAttribute("name"));
                            continue;
                        }
                        else if (nodeName.Equals("results"))
                        {
                            readingResults = true;
                            if (variables.Count != 1 && variables.Count != 3)
                            {
                                throw new NotSupportedException("Sparql results can be a list of id's(1 variable) or a list of triples(3 variables). Variables found:" + variables.Count);
                            }
                            continue;
                        }
                    }
                    else //reading results
                    {
                        if (variables.Count == 1) //load id's
                        {
                            if (nodeName.Equals("uri"))
                            {
                                string uri = null;
                                try
                                {
                                    uri = xmlReader.ReadElementContentAsString();
                                }
                                catch (Exception ex)
                                {
                                    Logging.LogError(BrightstarEventId.ClientDataBindError,
                                                     "Error binding to SPARQL results element. {0}", ex);
                                }
                                if (!String.IsNullOrEmpty(uri))
                                {
                                    yield return(_storeContext.MakeDataObject(uri));
                                }
                            }
                        }
                        else //load triples
                        {
                            var    isUri           = nodeName.Equals("uri");
                            var    isLiteral       = nodeName.Equals("literal");
                            string literalDataType = null;
                            string literalLanguage = null;
                            if (isUri || isLiteral)
                            {
                                string elementContentAsString = null;
                                try
                                {
                                    literalDataType        = xmlReader.GetAttribute("datatype");
                                    literalLanguage        = xmlReader.GetAttribute("xml:lang");
                                    elementContentAsString = xmlReader.ReadElementContentAsString();
                                }
                                catch (Exception ex)
                                {
                                    Logging.LogError(BrightstarEventId.ClientDataBindError,
                                                     "Error binding to SPARQL results element. {0}", ex);
                                }
                                if (!String.IsNullOrEmpty(elementContentAsString))
                                {
                                    xmlResultNodeTripleValues.Add(elementContentAsString);
                                }
                            }

                            //create new triple
                            if (xmlResultNodeTripleValues.Count == 3)
                            {
                                var s = xmlResultNodeTripleValues[0];

                                //if object was a literal it's the last read value => datatype, lang must match
                                var triple = new Triple
                                {
                                    Subject   = s,
                                    Predicate = xmlResultNodeTripleValues[1],
                                    IsLiteral = isLiteral,
                                    Object    = xmlResultNodeTripleValues[2],
                                    LangCode  = literalLanguage,
                                    DataType  = literalDataType ?? RdfDatatypes.String
                                };


                                if (resourceTriples.ContainsKey(s)) //resource already has triples
                                {
                                    resourceTriples[s].Add(triple);
                                }
                                else
                                {
                                    resourceTriples.Add(s, new List <Triple> {
                                        triple
                                    });
                                }

                                //if results are in order and we have new subject then we can create a new object for the previous one
                                if (resultsAreOrdered && lastLoadedSubject != null && lastLoadedSubject != s)
                                {
                                    var dataObject = _storeContext.MakeDataObject(lastLoadedSubject) as DataObject;
                                    dataObject.BindTriples(resourceTriples[lastLoadedSubject]);
                                    yield return(dataObject);
                                }

                                lastLoadedSubject = s;
                                xmlResultNodeTripleValues.Clear();
                            }
                        }
                    }
                }
            }
            xmlReader.Close();


            if (resultsAreOrdered && lastLoadedSubject != null)
            {
                var dataObject = _storeContext.MakeDataObject(lastLoadedSubject) as DataObject;
                dataObject.BindTriples(resourceTriples[lastLoadedSubject]);
                yield return(dataObject);
            }
            else
            {
                foreach (KeyValuePair <string, List <Triple> > resourceTriple in resourceTriples)
                {
                    var dataObject = _storeContext.MakeDataObject(resourceTriple.Key) as DataObject;
                    dataObject.BindTriples(resourceTriple.Value);

                    yield return(dataObject);
                }
            }
        }
 private static Triple MakeTriple(INode subjectNode, INode predicateNode, INode objectNode)
 {
     var litNode = objectNode as ILiteralNode;
     var t = new Triple
     {
         Subject = subjectNode.ToString(),
         Predicate = predicateNode.ToString(),
         IsLiteral = objectNode is ILiteralNode,
         Object = litNode != null ? litNode.Value : objectNode.ToString()
     };
     if (litNode == null) return t;
     t.DataType = litNode?.DataType?.ToString() ?? Constants.DefaultDatatypeUri;
     t.LangCode = litNode?.Language;
     return t;
 }