diff --git a/src/SQL2Linked/Implementations/UserStructuralData.cs b/src/SQL2Linked/Implementations/UserStructuralData.cs index b0b43c3e03e21483515e5b0cb61619308bc776c4..3771d33e7edb4e7be7a79173be8996a85943907a 100644 --- a/src/SQL2Linked/Implementations/UserStructuralData.cs +++ b/src/SQL2Linked/Implementations/UserStructuralData.cs @@ -1,15 +1,59 @@ using Coscine.Database.DataModel; using Coscine.Database.Models; +using Coscine.Metadata; using VDS.RDF; +using VDS.RDF.Query; namespace SQL2Linked.Implementations { public class UserStructuralData : StructuralData<User, UserModel> { + public readonly string UserUrlPrefix = "https://purl.org/coscine/users"; + public readonly Uri FoafPerson = new Uri("http://xmlns.com/foaf/0.1/Person"); + public override IEnumerable<IGraph> ConvertToLinkedData(IEnumerable<User> entries) { - // ToDo: Implement - throw new NotImplementedException(); + var graphs = new List<IGraph>(); + + foreach (User entry in entries) + { + string userGraphName = $"{UserUrlPrefix}/{entry.Id}"; + IGraph graph = RdfStoreConnector.GetGraph(userGraphName); + + // check if a triple with a foaf:Person already exists in the user graph + var getTriples = graph.GetTriplesWithObject(FoafPerson); + + if (getTriples.Count() == 0) + { + // check if a user graph already exists + bool exists = RdfStoreConnector.HasGraph(userGraphName); + + if (!exists) + { + RdfStoreConnector.CreateNamedGraph(userGraphName); + } + + // extend graph by triple https://purl.org/coscine/users/{userId} a foaf:Person + var commandString = new SparqlParameterizedString + { + CommandText = @"INSERT + { + GRAPH @userGraphName + { + [ + a foaf:Person ; + ] + } + }" + }; + + commandString.Namespaces.AddNamespace("foaf", FoafPrefixUrl); + commandString.SetUri("userGraphName", new Uri(userGraphName)); + QueryEndpoint.QueryRaw(commandString.ToString()); + } + graphs.Add(graph); + } + return graphs; } } } \ No newline at end of file diff --git a/src/SQL2Linked/StructuralData.cs b/src/SQL2Linked/StructuralData.cs index 883fe3fb3d8c6309632431a518d7cee605754ae8..b33123ca4499130a9a481b857416625d5da966b3 100644 --- a/src/SQL2Linked/StructuralData.cs +++ b/src/SQL2Linked/StructuralData.cs @@ -2,6 +2,7 @@ using Coscine.Database.Models; using Coscine.Metadata; using VDS.RDF; +using VDS.RDF.Query; namespace SQL2Linked { @@ -10,14 +11,17 @@ namespace SQL2Linked public T Model { get; init; } public ConsulConfiguration Configuration { get; init; } public RdfStoreConnector RdfStoreConnector { get; init; } - + public readonly SparqlRemoteEndpoint QueryEndpoint; + public readonly Uri FoafPrefixUrl = new Uri("http://xmlns.com/foaf/0.1/"); + public StructuralData() { Configuration = new ConsulConfiguration(); RdfStoreConnector = new RdfStoreConnector(Configuration.GetStringAndWait("coscine/local/virtuoso/additional/url")); Model = new T(); + QueryEndpoint = new SparqlRemoteEndpoint(new Uri(string.Format("http://localhost:8890/sparql"))); } - + public abstract IEnumerable<IGraph> ConvertToLinkedData(IEnumerable<S> entries); public void Migrate(bool dummyMode)