Skip to content

Commit f17fe95

Browse files
authored
Merge pull request #199 from carlajimenezarganda/master
assigment4
2 parents 04317af + eb89230 commit f17fe95

File tree

4 files changed

+517
-0
lines changed

4 files changed

+517
-0
lines changed

Assignment1/DatasetDescriptions.csv

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,4 @@ Rodrigo Nieto Rodríguez; Rodrix505; Puntos limpios fijos; https://datos.madrid.
1515
Yi Chen Chen; yichenchen2006; Principales parques y jardines municipales; https://datos.madrid.es/sites/v/index.jsp?vgnextoid=dc758935dde13410VgnVCM2000000c205a0aRCRD&vgnextchannel=374512b9ace9f310VgnVCM100000171f5a0aRCRD; Madrid ofrece un patrimonio verde de excepcional extensión y diversidad (más de 6.000 hectáreas, que suponen más de 18 metros cuadrados de parques y zonas verdes públicas por habitante de la ciudad).
1616
Carolina Simal;carol-2406;Arbolado en parques y zonas verdes de Madrid;https://datos.madrid.es/egob/catalogo/300264-81-Arbolado-parques-historico.csv;Número de arboles por parque de Madrid de cada especie.
1717
Luca Alvarez; lucaam06; Bomberos. Parques de bomberos; https://datos.madrid.es/egob/catalogo/211642-0-bomberos-parques.rdf; En este conjunto de datos, puede encontrar la relación de los trece parques de bomberos existentes en la ciudad de Madrid.
18+
Carla Jiménez Arganda; carlajimenezarganda; Zonas verdes de Madrid: zonas estanciales y ajardinadas; https://datos.madrid.es/egob/catalogo/300226-0-zonas-verdes-estanciales.rdf; Localización, características y tipologías de las zonas verdes estanciales y ajardinadas de Madrid.
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
# -*- coding: utf-8 -*-
2+
"""task06.py
3+
4+
Automatically generated by Colab.
5+
6+
Original file is located at
7+
https://colab.research.google.com/drive/107-7n1v0TnGM56KiXLUxrwTFF5U3qWnr
8+
"""
9+
10+
#!pip install rdflib
11+
12+
import rdflib
13+
print(rdflib.__version__)
14+
15+
import urllib.request
16+
17+
url = 'https://raw.githubusercontent.com/FacultadInformatica-LinkedData/Curso2025-2026/refs/heads/master/Assignment4/course_materials/python/validation.py'
18+
urllib.request.urlretrieve(url, 'validation.py')
19+
20+
from validation import Report
21+
22+
from rdflib import Graph, Namespace, Literal, XSD
23+
from rdflib.namespace import RDF, RDFS
24+
from validation import Report
25+
26+
27+
g = Graph()
28+
29+
r = Report()
30+
31+
ns = Namespace("http://mydomain.org#")
32+
g.namespace_manager.bind('ns', ns, override=False)
33+
34+
35+
g.add((ns.Researcher, RDF.type, RDFS.Class))
36+
for s, p, o in g:
37+
print(s, p, o)
38+
39+
ontology = Namespace("http://www.oeg-upm.net/Ontology#")
40+
person = Namespace("http://oeg.fi.upm.es/def/people#")
41+
42+
g.namespace_manager.bind('ontology', ontology)
43+
g.namespace_manager.bind('person', person)
44+
45+
# Clases
46+
g.add((person.Person , RDF.type, RDFS.Class))
47+
g.add((person.Professor , RDF.type, RDFS.Class))
48+
g.add((person.FullProfessor , RDF.type, RDFS.Class))
49+
g.add((person.AssociateProfessor , RDF.type, RDFS.Class))
50+
g.add((person.InterimAssociateProfessor , RDF.type, RDFS.Class))
51+
52+
# Etiquetas
53+
g.add((person.Person, RDFS.label, Literal("Person", datatype=XSD.string)))
54+
g.add((person.Professor, RDFS.label, Literal("Professor", datatype=XSD.string)))
55+
g.add((person.FullProfessor, RDFS.label, Literal("FullProfessor", datatype=XSD.string)))
56+
g.add((person.AssociateProfessor, RDFS.label, Literal("AssociateProfessor", datatype=XSD.string)))
57+
g.add((person.InterimAssociateProfessor, RDFS.label, Literal("InterimAssociateProfessor", datatype=XSD.string)))
58+
59+
# Subclases
60+
g.add((person.Professor, RDFS.subClassOf, person.Person))
61+
g.add((person.FullProfessor, RDFS.subClassOf, person.Professor))
62+
g.add((person.AssociateProfessor, RDFS.subClassOf, person.Professor))
63+
g.add((person.InterimAssociateProfessor, RDFS.subClassOf, person.AssociateProfessor))
64+
65+
r.validate_task_06_01(g)
66+
67+
# Propiedades
68+
g.add((person.hasName , RDF.type, RDF.Property))
69+
g.add((person.hasHomePage , RDF.type, RDF.Property))
70+
g.add((person.hasColleague , RDF.type, RDF.Property))
71+
72+
# Labels
73+
g.add((person.hasName, RDFS.label, Literal("hasName", datatype=XSD.string)))
74+
g.add((person.hasHomePage, RDFS.label, Literal("hasHomePage", datatype=XSD.string)))
75+
g.add((person.hasColleague, RDFS.label, Literal("hasColleague", datatype=XSD.string)))
76+
77+
# Dominios
78+
g.add((person.hasName, RDFS.domain, person.Person))
79+
g.add((person.hasHomePage, RDFS.domain, person.FullProfessor))
80+
g.add((person.hasColleague, RDFS.domain, person.Person))
81+
82+
# Rangos
83+
g.add((person.hasName, RDFS.range, RDFS.Literal))
84+
g.add((person.hasColleague, RDFS.range, person.Person))
85+
g.add((person.hasHomePage, RDFS.range, RDFS.Literal))
86+
87+
r.validate_task_06_02(g)
88+
89+
data = Namespace("http://oeg.fi.upm.es/resource/person/")
90+
91+
# Instancias
92+
g.add((data.Oscar, RDF.type, person.AssociateProfessor))
93+
g.add((data.Asun, RDF.type, person.FullProfessor))
94+
g.add((data.Raul, RDF.type, person.InterimAssociateProfessor))
95+
96+
# Etiquetas
97+
g.add((data.Oscar, RDFS.label, Literal("Oscar", datatype=XSD.string)))
98+
g.add((data.Asun, RDFS.label, Literal("Asun", datatype=XSD.string)))
99+
g.add((data.Raul, RDFS.label, Literal("Raul", datatype=XSD.string)))
100+
101+
# Relaciones / propiedades
102+
g.add((data.Oscar, person.hasName, Literal("Óscar Corcho García", datatype=XSD.string)))
103+
g.add((data.Oscar, person.hasColleague, data.Asun))
104+
g.add((data.Asun, person.hasColleague, data.Raul))
105+
g.add((data.Asun, person.hasHomePage, Literal("http://www.oeg-upm.net/", datatype=XSD.string)))
106+
107+
r.validate_task_06_03(g)
108+
109+
vcard = Namespace("http://www.w3.org/2001/vcard-rdf/3.0/")
110+
foaf = Namespace("http://xmlns.com/foaf/0.1/")
111+
112+
# Tipos
113+
g.add((foaf.email , RDF.type, RDFS.Datatype))
114+
g.add((vcard.Family , RDF.type, RDF.Property))
115+
g.add((vcard.Given , RDF.type, RDFS.Datatype))
116+
117+
# Rangos
118+
g.add((foaf.email , RDFS.range, XSD.string))
119+
g.add((vcard.Family , RDFS.range, XSD.string))
120+
g.add((vcard.Given , RDFS.range, XSD.string))
121+
122+
# Datos de Oscar
123+
g.add((data.Oscar, foaf.email, Literal("[email protected]")))
124+
g.add((data.Oscar, vcard.Family, Literal("Corcho García")))
125+
g.add((data.Oscar, vcard.Given, Literal("Oscar")))
126+
127+
r.validate_task_06_04(g)
128+
r.save_report("_Task_06")
129+
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
# -*- coding: utf-8 -*-
2+
"""task07.py
3+
4+
Automatically generated by Colab.
5+
"""
6+
7+
#!pip install rdflib # Comentada según instrucciones
8+
9+
from validation import Report
10+
11+
from rdflib import Graph, Namespace, Literal
12+
from rdflib.namespace import RDF, RDFS
13+
14+
g = Graph()
15+
g.namespace_manager.bind('ns', Namespace("http://somewhere#"), override=False)
16+
17+
github_storage = "https://raw.githubusercontent.com/FacultadInformatica-LinkedData/Curso2025-2026/master/Assignment4/course_materials"
18+
g.parse(github_storage + "/rdf/data06.ttl", format="ttl")
19+
20+
report = Report()
21+
22+
result = []
23+
24+
for cls in g.subjects(RDF.type, RDFS.Class):
25+
super_cls = None
26+
for sc in g.objects(cls, RDFS.subClassOf):
27+
super_cls = sc
28+
result.append((cls, super_cls))
29+
30+
for r in result:
31+
print(r)
32+
33+
report.validate_07_1a(result)
34+
35+
query = """
36+
SELECT ?c ?sc
37+
WHERE {
38+
?c a rdfs:Class .
39+
OPTIONAL { ?c rdfs:subClassOf ?sc }
40+
}
41+
"""
42+
43+
for r in g.query(query):
44+
print(r.c, r.sc)
45+
46+
report.validate_07_1b(query, g)
47+
48+
from rdflib import RDF, RDFS, Namespace
49+
50+
ns = Namespace("http://oeg.fi.upm.es/def/people#")
51+
individuals = []
52+
53+
def get_all_subclasses(cls, graph):
54+
subclasses = set()
55+
for subclass in graph.subjects(RDFS.subClassOf, cls):
56+
subclasses.add(subclass)
57+
subclasses.update(get_all_subclasses(subclass, graph))
58+
return subclasses
59+
60+
all_person_classes = set([ns.Person])
61+
all_person_classes.update(get_all_subclasses(ns.Person, g))
62+
63+
for cls in all_person_classes:
64+
for ind in g.subjects(RDF.type, cls):
65+
if ind not in individuals:
66+
individuals.append(ind)
67+
68+
for i in individuals:
69+
print(i)
70+
71+
report.validate_07_02a(individuals)
72+
73+
query = """
74+
SELECT ?ind
75+
WHERE {
76+
?ind a/rdfs:subClassOf* <http://oeg.fi.upm.es/def/people#Person> .
77+
}
78+
"""
79+
80+
for r in g.query(query):
81+
print(r.ind)
82+
83+
report.validate_07_02b(g, query)
84+
85+
query = """
86+
SELECT ?name ?type
87+
WHERE {
88+
?person <http://oeg.fi.upm.es/def/people#knows> <http://oeg.fi.upm.es/def/people#Rocky> .
89+
?person <http://www.w3.org/2000/01/rdf-schema#label> ?name .
90+
?person a ?type .
91+
}
92+
"""
93+
94+
for r in g.query(query):
95+
print(r.name, r.type)
96+
97+
report.validate_07_03(g, query)
98+
99+
query = """
100+
SELECT ?name ?type
101+
WHERE {
102+
?person <http://oeg.fi.upm.es/def/people#knows> <http://oeg.fi.upm.es/def/people#Rocky> .
103+
?person rdfs:label ?name .
104+
?person a ?type .
105+
}
106+
"""
107+
108+
for r in g.query(query):
109+
print(r.name, r.type)
110+
111+
report.validate_07_03(g, query)
112+
113+
query = """
114+
SELECT DISTINCT ?ind
115+
WHERE {
116+
?ind a ?class .
117+
?class rdfs:subClassOf* <http://oeg.fi.upm.es/def/people#Person> .
118+
}
119+
"""
120+
121+
individuals = []
122+
for r in g.query(query):
123+
individuals.append(r.ind)
124+
print(r.ind)
125+
126+
report.validate_07_02b(g, query)
127+
128+
129+
report.save_report("_Task_07")

0 commit comments

Comments
 (0)