diff --git a/src/SQL2Linked/Implementations/ProjectStructuralData.cs b/src/SQL2Linked/Implementations/ProjectStructuralData.cs index 97f2dfba0106661faa31dd80df644b288b7528c0..7fb8f51fe5f554210b8e46cb4f9cc0a6936cbf98 100644 --- a/src/SQL2Linked/Implementations/ProjectStructuralData.cs +++ b/src/SQL2Linked/Implementations/ProjectStructuralData.cs @@ -6,10 +6,133 @@ namespace SQL2Linked.Implementations { public class ProjectStructuralData : StructuralData<Project, ProjectModel> { + public readonly Uri org = new("http://www.w3.org/ns/org#"); + public readonly Uri dcat = new("http://www.w3.org/ns/dcat#"); + public readonly Uri dcterms = new("http://purl.org/dc/terms/"); + public readonly Uri foaf = new("http://xmlns.com/foaf/0.1/"); + public readonly Uri vcard = new("http://www.w3.org/2006/vcard/ns#"); + public readonly Uri rdf = new("http://www.w3.org/1999/02/22-rdf-syntax-ns#"); + public readonly Uri cosc = new("https://purl.org/coscine/"); + private VisibilityModel VisibilityModel = new VisibilityModel(); + private ProjectRoleModel ProjectRoleModel = new ProjectRoleModel(); + private ProjectResourceModel ProjectResourceModel = new ProjectResourceModel(); + public override IEnumerable<IGraph> ConvertToLinkedData(IEnumerable<Project> entries) { - // ToDo: Implement - throw new NotImplementedException(); + IEnumerable<Visibility> visibilities = VisibilityModel.GetAll(); + IEnumerable<ProjectRole> projectRoles = ProjectRoleModel.GetAll(); + IEnumerable<ProjectResource> projectResources = ProjectResourceModel.GetAll(); + + var graphs = new List<IGraph>(); + string projectUrlPrefix = "https://hdl.handle.net/" + Prefix; + + foreach (var entry in entries) + { + var projectGraphName = $"{projectUrlPrefix}/{entry.Id}"; + + var graph = new Graph(); + graph.BaseUri = new Uri(projectGraphName); + + AssertToGraphUriNode(graph, projectGraphName, rdf + "type", dcat + "Catalog"); + Console.WriteLine($"For project '{entry.DisplayName}' will migrate triple '{projectGraphName} {rdf}type {dcat}Catalog'. "); + + AssertToGraphUriNode(graph, projectGraphName, rdf + "type", org + "OrganizationalCollaboration"); + Console.WriteLine($"For project '{entry.DisplayName}' will migrate triple '{projectGraphName} {rdf}type {org}OrganizationalCollaboration'. "); + + AssertToGraphUriNode(graph, projectGraphName, rdf + "type", vcard + "Group"); + Console.WriteLine($"For project '{entry.DisplayName}' will migrate triple '{projectGraphName} {rdf}type {vcard}Group'. "); + + AssertToGraphLiteralNode(graph, projectGraphName, dcterms + "title", entry.ProjectName); + Console.WriteLine($"For project '{entry.DisplayName}' will migrate triple '{projectGraphName} {dcterms}title {entry.ProjectName}'. "); + + AssertToGraphLiteralNode(graph, projectGraphName, dcterms + "description", entry.Description); + Console.WriteLine($"For project '{entry.DisplayName}' will migrate triple '{projectGraphName} {dcterms}description {entry.Description}'. "); + + AssertToGraphLiteralNode(graph, projectGraphName, dcat + "startDate", entry.StartDate.ToString()); + Console.WriteLine($"For project '{entry.DisplayName}' will migrate triple '{projectGraphName} {dcat}startDate {entry.StartDate}'. "); + + AssertToGraphLiteralNode(graph, projectGraphName, dcat + "endDate", entry.EndDate.ToString()); + Console.WriteLine($"For project '{entry.DisplayName}' will migrate triple '{projectGraphName} {dcat}endDate {entry.EndDate}'. "); + + if (!string.IsNullOrWhiteSpace(entry.Keywords)) + { + var listKeywords = entry.Keywords.Split(';').ToList(); + foreach (var keyword in listKeywords) + { + AssertToGraphLiteralNode(graph, projectGraphName, dcterms + "subject", keyword); + Console.WriteLine($"For project '{entry.DisplayName}' will migrate triple '{projectGraphName} {dcterms}subject {keyword}'. "); + } + } + + AssertToGraphLiteralNode(graph, projectGraphName, dcterms + "alternative", entry.DisplayName); + Console.WriteLine($"For project '{entry.DisplayName}' will migrate triple '{projectGraphName} {dcterms}alternative {entry.DisplayName}'. "); + + AssertToGraphLiteralNode(graph, projectGraphName, dcterms + "rightsHolder", entry.PrincipleInvestigators); + Console.WriteLine($"For project '{entry.DisplayName}' will migrate triple '{projectGraphName} {dcterms}rightsHolder {entry.PrincipleInvestigators}'. "); + + AssertToGraphLiteralNode(graph, projectGraphName, "https://schema.org/funding", entry.GrantId); + Console.WriteLine($"For project '{entry.DisplayName}' will migrate triple '{projectGraphName} https://schema.org/funding {entry.GrantId}'. "); + + foreach (var visibility in visibilities) + { + if (entry.VisibilityId == visibility.Id && visibility.DisplayName.Contains("Public")) + { + AssertToGraphUriNode(graph, projectGraphName, cosc + "terms/project#visibility", cosc + $"terms/visibility#public"); + Console.WriteLine($"For project '{entry.DisplayName}' will migrate triple '{projectGraphName} {cosc}terms/project#visibility {cosc}terms/visibility#public'. "); + break; + } + else if (entry.VisibilityId == visibility.Id && visibility.DisplayName.Contains("Project Members")) + { + AssertToGraphUriNode(graph, projectGraphName, cosc + "terms/project#visibility", cosc + $"terms/visibility#projectMember"); + Console.WriteLine($"For project '{entry.DisplayName}' will migrate triple '{projectGraphName} {cosc}terms/project#visibility {cosc}terms/visibility#projectMember'. "); + break; + } + } + + AssertToGraphLiteralNode(graph, projectGraphName, cosc + "terms/project#deleted", entry.Deleted.ToString(), new Uri("http://www.w3.org/2001/XMLSchema#boolean")); + Console.WriteLine($"For project '{entry.DisplayName}' will migrate triple '{projectGraphName} {cosc}terms/project#deleted {entry.Deleted}'. "); + + AssertToGraphLiteralNode(graph, projectGraphName, cosc + "terms/project#slug", entry.Slug); + Console.WriteLine($"For project '{entry.DisplayName}' will migrate triple '{projectGraphName} {cosc}terms/project#slug {entry.Slug}'. "); + + AssertToGraphUriNode(graph, projectGraphName, foaf + "homepage", projectGraphName); + Console.WriteLine($"For project '{entry.DisplayName}' will migrate triple '{projectGraphName} {foaf}homepage {projectGraphName}'. "); + + foreach (var projectRole in projectRoles) + { + if (entry.Id == projectRole.ProjectId) + { + AssertToGraphUriNode(graph, projectGraphName, vcard + "hasMember", cosc + "users/" + projectRole.UserId); + Console.WriteLine($"For project '{entry.DisplayName}' will migrate triple '{projectGraphName} {vcard}hasMember {cosc}users/{projectRole.UserId}'. "); + + var blankNode = graph.CreateBlankNode(); + + AssertToGraphBlankAndUriNode(graph, blankNode, rdf + "type", org + "Membership"); + Console.WriteLine($"For project '{entry.DisplayName}' will migrate triple '{blankNode} {rdf}type {org}Membership'. "); + + AssertToGraphBlankAndUriNode(graph, blankNode, org + "organization", projectGraphName); + Console.WriteLine($"For project '{entry.DisplayName}' will migrate triple '{blankNode} {org}organization {projectGraphName}'. "); + + AssertToGraphBlankAndUriNode(graph, blankNode, org + "role", cosc + "roles/" + projectRole.RoleId); + Console.WriteLine($"For project '{entry.DisplayName}' will migrate triple '{blankNode} {org}role {cosc}roles/{projectRole.RoleId}'. "); + + AssertToGraphBlankAndUriNode(graph, blankNode, org + "member", cosc + "users/" + projectRole.UserId); + Console.WriteLine($"For project '{entry.DisplayName}' will migrate triple '{blankNode} {org}member {cosc}users/{projectRole.UserId}'. "); + } + } + + foreach (var projectResource in projectResources) + { + if (entry.Id == projectResource.ProjectId) + { + AssertToGraphUriNode(graph, projectGraphName, dcat + "catalog", $"{projectUrlPrefix}/{projectResource.ResourceId}"); + Console.WriteLine($"For project '{entry.DisplayName}' will migrate triple '{projectGraphName} {dcat}catalog {projectUrlPrefix}/{projectResource.ResourceId}'. "); + } + } + + graphs.Add(graph); + } + return graphs; } } } \ No newline at end of file