public static string ToNQuads(RdfDataset dataset) { IList <string> quads = new List <string>(); foreach (var graphName in dataset.GraphNames()) { var eachGraphName = graphName; var triples = dataset.GetQuads(eachGraphName); if ("@default".Equals(eachGraphName)) { eachGraphName = null; } foreach (var triple in triples) { quads.Add(ToNQuad(triple, eachGraphName)); } } ((List <string>)quads).Sort(StringComparer.Ordinal); var rval = string.Empty; foreach (var quad in quads) { rval += quad; } return(rval); }
/// <summary>Parses RDF in the form of N-Quads.</summary> /// <remarks>Parses RDF in the form of N-Quads.</remarks> /// <param name="input">the N-Quads input to parse.</param> /// <returns>an RDF dataset.</returns> /// <exception cref="JsonLD.Core.JsonLdError"></exception> public static RdfDataset ParseNQuads(string input) { // build RDF dataset var dataset = new RdfDataset(); // split N-Quad input into lines var lines = Regex.Eoln.Split(input); var lineNumber = 0; foreach (var line in lines) { lineNumber++; // skip empty lines if (Regex.EmptyOrComment.Matcher(line).Matches()) { continue; } // parse quad var match = Regex.Quad.Matcher(line); if (!match.Matches()) { throw new JsonLdError(JsonLdError.Error.SyntaxError, "Error while parsing N-Quads; invalid quad. line:" + lineNumber); } // get subject RdfDataset.Node subject; if (match.Group(1) != null) { var subjectIri = Unescape(match.Group(1)); AssertAbsoluteIri(subjectIri); subject = new RdfDataset.IRI(subjectIri); } else { subject = new RdfDataset.BlankNode(Unescape(match.Group(2))); } // get predicate var predicateIri = Unescape(match.Group(3)); AssertAbsoluteIri(predicateIri); RdfDataset.Node predicate = new RdfDataset.IRI(predicateIri); // get object RdfDataset.Node @object; if (match.Group(4) != null) { var objectIri = Unescape(match.Group(4)); AssertAbsoluteIri(objectIri); @object = new RdfDataset.IRI(objectIri); } else { if (match.Group(5) != null) { @object = new RdfDataset.BlankNode(Unescape(match.Group(5))); } else { var language = Unescape(match.Group(8)); var datatype = match.Group(7) != null?Unescape(match.Group(7)) : match.Group (8) != null ? JsonLdConsts.RdfLangstring : JsonLdConsts.XsdString; AssertAbsoluteIri(datatype); var unescaped = Unescape(match.Group(6)); @object = new RdfDataset.Literal(unescaped, datatype, language); } } // get graph name ('@default' is used for the default graph) var name = "@default"; if (match.Group(9) != null) { name = Unescape(match.Group(9)); AssertAbsoluteIri(name); } else { if (match.Group(10) != null) { name = Unescape(match.Group(10)); } } var triple = new RdfDataset.Quad(subject, predicate, @object, name); // initialise graph in dataset if (!dataset.ContainsKey(name)) { IList <RdfDataset.Quad> tmp = new List <RdfDataset.Quad>(); tmp.Add(triple); dataset[name] = tmp; } else { // add triple if unique to its graph var triples = (IList <RdfDataset.Quad>)dataset[name]; if (!triples.Contains(triple)) { triples.Add(triple); } } } return(dataset); }