dotNetRDF em C#
Biblioteca .NET para RDF — IGraph, SPARQL local e remoto, SHACL, integração com triplestore
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.