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);
        }