From 5d1fc85c5ba44ec05af9c9646caa83259f15d42f Mon Sep 17 00:00:00 2001 From: Sihan Du Date: Sun, 7 Dec 2025 11:32:38 +0100 Subject: [PATCH] Create task06.py --- Assignment4/Sihan_Du_24C021/task06.py | 158 ++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 Assignment4/Sihan_Du_24C021/task06.py diff --git a/Assignment4/Sihan_Du_24C021/task06.py b/Assignment4/Sihan_Du_24C021/task06.py new file mode 100644 index 00000000..9d8fee42 --- /dev/null +++ b/Assignment4/Sihan_Du_24C021/task06.py @@ -0,0 +1,158 @@ +# -*- coding: utf-8 -*- +"""Task06 + +Automatically generated by Colab. + +Original file is located at + https://colab.research.google.com/drive/1e0oOdsx6Ab002N8PRAwoIJg1K0Lmvrt3 + +**Task 06: Modifying RDF(s)** +""" + +#!pip install rdflib +import urllib.request +url = 'https://raw.githubusercontent.com/FacultadInformatica-LinkedData/Curso2025-2026/refs/heads/master/Assignment4/course_materials/python/validation.py' +urllib.request.urlretrieve(url, 'validation.py') +github_storage = "https://raw.githubusercontent.com/FacultadInformatica-LinkedData/Curso2025-2026/master/Assignment4/course_materials" + +"""Import RDFLib main methods""" + +from rdflib import Graph, Namespace, Literal, XSD +from rdflib.namespace import RDF, RDFS +from validation import Report +g = Graph() +g.namespace_manager.bind('ns', Namespace("http://somewhere#"), override=False) +r = Report() + +"""Create a new class named Researcher""" + +ns = Namespace("http://mydomain.org#") +g.add((ns.Researcher, RDF.type, RDFS.Class)) +for s, p, o in g: + print(s,p,o) + +"""**Task 6.0: Create new prefixes for "ontology" and "person" as shown in slide 14 of the Slidedeck 01a.RDF(s)-SPARQL shown in class.**""" + +# this task is validated in the next step +ontology = Namespace("http://oeg.fi.upm.es/def/people#") +person= Namespace("http://oeg.fi.upm.es/resource/person/") + +"""**TASK 6.1: Reproduce the taxonomy of classes shown in slide 34 in class (all the classes under "Vocabulario", Slidedeck: 01a.RDF(s)-SPARQL). Add labels for each of them as they are in the diagram (exactly) with no language tags. Remember adding the correct datatype (xsd:String) when appropriate** + +""" + +people = Namespace("http://oeg.fi.upm.es/def/people#") + +Person = people.Person +Professor = people.Professor +AssociateProfessor = people.AssociateProfessor +InterimAssociateProfessor = people.InterimAssociateProfessor +FullProfessor = people.FullProfessor + +for cls in [Person, Professor, AssociateProfessor, InterimAssociateProfessor, FullProfessor]: + g.add((cls, RDF.type, RDFS.Class)) + +g.add((Professor, RDFS.subClassOf, Person)) +g.add((AssociateProfessor, RDFS.subClassOf, Professor)) +g.add((InterimAssociateProfessor, RDFS.subClassOf, AssociateProfessor)) +g.add((FullProfessor, RDFS.subClassOf, Professor)) + +labels = { + Person: "Person", + Professor: "Professor", + AssociateProfessor: "AssociateProfessor", + InterimAssociateProfessor: "InterimAssociateProfessor", + FullProfessor: "FullProfessor" +} +for cls, label in labels.items(): + g.add((cls, RDFS.label, Literal(label, datatype=XSD.string))) + +# Validation. Do not remove +r.validate_task_06_01(g) + +"""**TASK 6.2: Add the 3 properties shown in slide 36. Add labels for each of them (exactly as they are in the slide, with no language tags), and their corresponding domains and ranges using RDFS. Remember adding the correct datatype (xsd:String) when appropriate. If a property has no range, make it a literal (string)**""" + +# TO DO +hasColleague = people.hasColleague +hasName = people.hasName +hasHomePage = people.hasHomePage + + +for prop in [hasColleague, hasName, hasHomePage]: + g.add((prop, RDF.type, RDF.Property)) + +g.add((hasColleague, RDFS.label, Literal("hasColleague", datatype=XSD.string))) +g.add((hasName, RDFS.label, Literal("hasName", datatype=XSD.string))) +g.add((hasHomePage, RDFS.label, Literal("hasHomePage", datatype=XSD.string))) + + +g.add((hasColleague, RDFS.domain, people.Person)) +g.add((hasColleague, RDFS.range, people.Person)) + +g.add((hasName, RDFS.domain, people.Person)) +g.add((hasName, RDFS.range, RDFS.Literal)) + +g.add((hasHomePage, RDFS.domain, people.FullProfessor)) +g.add((hasHomePage, RDFS.range, RDFS.Literal)) + +# Visualize the results +for s, p, o in g: + print(s,p,o) + +# Validation. Do not remove +r.validate_task_06_02(g) + +"""**TASK 6.3: Create the individuals shown in slide 36 under "Datos". Link them with the same relationships shown in the diagram."**""" + +# TO DO +Oscar = person.Oscar +Asun = person.Asun +Raul = person.Raul + +g.add((Oscar, RDF.type, people.FullProfessor)) +g.add((Asun, RDF.type, people.AssociateProfessor)) +g.add((Raul, RDF.type, people.InterimAssociateProfessor)) + +g.add((Oscar, RDFS.label, Literal("Oscar", datatype=XSD.string))) +g.add((Asun, RDFS.label, Literal("Asun", datatype=XSD.string))) +g.add((Raul, RDFS.label, Literal("Raul", datatype=XSD.string))) + +g.add((Oscar, people.hasColleague, Asun)) +g.add((Oscar, people.hasName, Literal("Óscar Corcho García", datatype=XSD.string))) +g.add((Asun, people.hasColleague, Raul)) +g.add((Asun, people.hasHomePage, Literal("http://www.oeg-upm.net/", datatype=XSD.string))) +g.add((Raul, people.hasColleague, Oscar)) +g.add((Raul, people.hasName, Literal("Raul", datatype=XSD.string))) +# Visualize the results +for s, p, o in g: + print(s,p,o) + +r.validate_task_06_03(g) + +"""**TASK 6.4: Add to the individual person:Oscar the email address, given and family names. Use the properties already included in example 4 to describe Jane and John (https://raw.githubusercontent.com/FacultadInformatica-LinkedData/Curso2025-2026/master/Assignment4/course_materials/rdf/example4.rdf). Do not import the namespaces, add them manually** + +""" + +# TO DO +VCARD = Namespace("http://www.w3.org/2001/vcard-rdf/3.0/") +FOAF = Namespace("http://xmlns.com/foaf/0.1/") + +g.add((FOAF.email, RDF.type, RDFS.Datatype)) +g.add((FOAF.eamil, RDFS.range, XSD.string)) + +g.add((VCARD.Given, RDF.type, RDF.Property)) +g.add((VCARD.Given, RDFS.range, XSD.string)) + +g.add((VCARD.Family, RDF.type, RDF.Property)) +g.add((VCARD.Family, RDFS.range, XSD.string)) + +g.add((Oscar, VCARD.Family, Literal("Corcho García"))) +g.add((Oscar, VCARD.Given, Literal("Oscar"))) +g.add((Oscar, FOAF.email, Literal("ocorcho@fi.upm.es"))) +# Visualize the results +for s, p, o in g: + print(s,p,o) + +# Validation. Do not remove +r.validate_task_06_04(g) +r.save_report("_Task_06")