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)