dotNetRDF é a biblioteca canônica de RDF para .NET. Cobre o stack completo: parsing/writing (Turtle, RDF/XML, JSON-LD, N-Triples), grafo in-memory, SPARQL local (Leviathan), cliente para triplestores remotos (Fuseki, Stardog, Neptune), e ShaclProcessor para validação. NuGet package: dotNetRDF.

Pacotes NuGet

# Stack completa dotnet add package dotNetRDF # core: IGraph, parsing, SPARQL local dotnet add package dotNetRDF.Query.Spin # opcional: SPIN constraints dotnet add package VDS.RDF.AspNetCore # opcional: middleware se for hospedar SPARQL

Imports principais

using VDS.RDF; using VDS.RDF.Parsing; using VDS.RDF.Writing; using VDS.RDF.Query; using VDS.RDF.Query.Inference; using VDS.RDF.Update; using VDS.RDF.Shacl;

"Hello, triple"

using VDS.RDF; using VDS.RDF.Writing; var g = new Graph(); // Declara prefixes pra Turtle output legível g.NamespaceMap.AddNamespace("mtg", new Uri("https:1 g.NamespaceMap.AddNamespace("sch", new Uri("https://kb.vinirossado.dev/mtg/schema/")); // Cria nós var card = g.CreateUriNode("mtg:LightningBolt"); var hasName = g.CreateUriNode("sch:hasName"); var name = g.CreateLiteralNode("Lightning Bolt", "en"); // Assert a tripla g.Assert(new Triple(card, hasName, name)); // Serialize var writer = new CompressingTurtleWriter(); writer.Save(g, "card.ttl");

Padrão de DI em ASP.NET Core

// Program.cs var builder = WebApplication.CreateBuilder(args); // Triplestore remoto: registrar o cliente via IHttpClientFactory builder.Services.AddHttpClient<SparqlQueryClient>(client => { client.BaseAddress = new Uri("http:2 client.Timeout = TimeSpan.FromSeconds(30); }); 3 builder.Services.AddSingleton<IGraph>(sp => { var g = new Graph(); new TurtleParser().Load(g, "ontology/mtg-schema.ttl"); return g; }); 4 builder.Services.AddSingleton<ShapesGraph>(sp => { var shapesGraph = new Graph(); new TurtleParser().Load(shapesGraph, "shapes/mtg-shapes.ttl"); return new ShapesGraph(shapesGraph); });
Por que registrar IGraph como Singleton em vez de Scoped?
Depende do uso. Para um grafo carregado uma vez no startup (TBox, ontologia estática), Singleton é correto — thread-safe pela natureza de IGraph (operações de leitura são seguras). Para grafos com escrita concorrente, considere ThreadSafeGraph de dotNetRDF, ou Scoped por request. Para triplestore remoto via SparqlQueryClient, registrar com HttpClient via IHttpClientFactory — Singleton do client, HttpClient é reutilizado.