Lab Solutions: Difference between revisions
From info216
(Added proposed solution for Lab 6) |
No edit summary |
||
(9 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
Here we will present suggested solutions after each lab. ''The page will be updated as the course progresses'' | Here we will present suggested solutions after each lab. ''The page will be updated as the course progresses'' | ||
<!-- | |||
=Getting started (Lab 1)= | =Getting started (Lab 1)= | ||
Line 334: | Line 335: | ||
OPTIONAL{ | OPTIONAL{ | ||
?s ns1:pardoned ?pardon . | ?s ns1:pardoned ?pardon . | ||
FILTER (?pardon = | FILTER (?pardon = true) | ||
} | } | ||
} | } | ||
Line 1,067: | Line 1,068: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
=CSV to RDF (Lab 7)= | |||
<syntaxhighlight lang="Python"> | |||
#Imports | |||
import re | |||
from pandas import * | |||
from numpy import nan | |||
from rdflib import Graph, Namespace, URIRef, Literal, RDF, XSD, FOAF | |||
from spotlight import SpotlightException, annotate | |||
SERVER = "https://api.dbpedia-spotlight.org/en/annotate" | |||
# Test around with the confidence, and see how many names changes depending on the confidence. | |||
# However, be aware that anything lower than this (0.83) it will replace James W. McCord and other names that includes James with LeBron James | |||
CONFIDENCE = 0.83 | |||
# This function uses DBpedia Spotlight, which was not a part of the CSV lab this year. | |||
def annotate_entity(entity, filters={'types': 'DBpedia:Person'}): | |||
annotations = [] | |||
try: | |||
annotations = annotate(address=SERVER, text=entity, confidence=CONFIDENCE, filters=filters) | |||
except SpotlightException as e: | |||
print(e) | |||
return annotations | |||
g = Graph() | |||
ex = Namespace("http://example.org/") | |||
g.bind("ex", ex) | |||
#Pandas' read_csv function to load russia-investigation.csv | |||
df = read_csv("russia-investigation.csv") | |||
#Replaces all instances of nan to None type with numpy's nan | |||
df = df.replace(nan, None) | |||
#Function that prepares the values to be added to the graph as a URI (ex infront) or Literal | |||
def prepareValue(row): | |||
if row == None: #none type | |||
value = Literal(row) | |||
elif isinstance(row, str) and re.match(r'\d{4}-\d{2}-\d{2}', row): #date | |||
value = Literal(row, datatype=XSD.date) | |||
elif isinstance(row, bool): #boolean value (true / false) | |||
value = Literal(row, datatype=XSD.boolean) | |||
elif isinstance(row, int): #integer | |||
value = Literal(row, datatype=XSD.integer) | |||
elif isinstance(row, str): #string | |||
value = URIRef(ex + row.replace('"', '').replace(" ", "_").replace(",","").replace("-", "_")) | |||
elif isinstance(row, float): #float | |||
value = Literal(row, datatype=XSD.float) | |||
return value | |||
#Convert the non-semantic CSV dataset into a semantic RDF | |||
def csv_to_rdf(df): | |||
for index, row in df.iterrows(): | |||
id = URIRef(ex + "Investigation_" + str(index)) | |||
investigation = prepareValue(row["investigation"]) | |||
investigation_start = prepareValue(row["investigation-start"]) | |||
investigation_end = prepareValue(row["investigation-end"]) | |||
investigation_days = prepareValue(row["investigation-days"]) | |||
indictment_days = prepareValue(row["indictment-days "]) | |||
cp_date = prepareValue(row["cp-date"]) | |||
cp_days = prepareValue(row["cp-days"]) | |||
overturned = prepareValue(row["overturned"]) | |||
pardoned = prepareValue(row["pardoned"]) | |||
american = prepareValue(row["american"]) | |||
outcome = prepareValue(row["type"]) | |||
name_ex = prepareValue(row["name"]) | |||
president_ex = prepareValue(row["president"]) | |||
#Spotlight Search | |||
name = annotate_entity(str(row['name'])) | |||
president = annotate_entity(str(row['president']).replace(".", "")) | |||
#Adds the tripples to the graph | |||
g.add((id, RDF.type, ex.Investigation)) | |||
g.add((id, ex.investigation, investigation)) | |||
g.add((id, ex.investigation_start, investigation_start)) | |||
g.add((id, ex.investigation_end, investigation_end)) | |||
g.add((id, ex.investigation_days, investigation_days)) | |||
g.add((id, ex.indictment_days, indictment_days)) | |||
g.add((id, ex.cp_date, cp_date)) | |||
g.add((id, ex.cp_days, cp_days)) | |||
g.add((id, ex.overturned, overturned)) | |||
g.add((id, ex.pardoned, pardoned)) | |||
g.add((id, ex.american, american)) | |||
g.add((id, ex.outcome, outcome)) | |||
#Spotlight search | |||
#Name | |||
try: | |||
g.add((id, ex.person, URIRef(name[0]["URI"]))) | |||
except: | |||
g.add((id, ex.person, name_ex)) | |||
#President | |||
try: | |||
g.add((id, ex.president, URIRef(president[0]["URI"]))) | |||
except: | |||
g.add((id, ex.president, president_ex)) | |||
csv_to_rdf(df) | |||
print(g.serialize()) | |||
g.serialize("lab7.ttl", format="ttl") | |||
</syntaxhighlight> | |||
=JSON-LD (Lab 8)= | |||
== Task 1) Basic JSON-LD == | |||
<syntaxhighlight lang="JSON-LD"> | |||
{ | |||
"@context": { | |||
"@base": "http://example.org/", | |||
"edges": "http://example.org/triple", | |||
"start": "http://example.org/source", | |||
"rel": "http://exaxmple.org/predicate", | |||
"end": "http://example.org/object", | |||
"Person" : "http://example.org/Person", | |||
"birthday" : { | |||
"@id" : "http://example.org/birthday", | |||
"@type" : "xsd:date" | |||
}, | |||
"nameEng" : { | |||
"@id" : "http://example.org/en/name", | |||
"@language" : "en" | |||
}, | |||
"nameFr" : { | |||
"@id" : "http://example.org/fr/name", | |||
"@language" : "fr" | |||
}, | |||
"nameCh" : { | |||
"@id" : "http://example.org/ch/name", | |||
"@language" : "ch" | |||
}, | |||
"age" : { | |||
"@id" : "http://example.org/age", | |||
"@type" : "xsd:int" | |||
}, | |||
"likes" : "http://example.org/games/likes", | |||
"haircolor" : "http://example.org/games/haircolor" | |||
}, | |||
"@graph": [ | |||
{ | |||
"@id": "people/Jeremy", | |||
"@type": "Person", | |||
"birthday" : "1987.1.1", | |||
"nameEng" : "Jeremy", | |||
"age" : 26 | |||
}, | |||
{ | |||
"@id": "people/Tom", | |||
"@type": "Person" | |||
}, | |||
{ | |||
"@id": "people/Ju", | |||
"@type": "Person", | |||
"birthday" : "2001.1.1", | |||
"nameCh" : "Ju", | |||
"age" : 22, | |||
"likes" : "bastketball" | |||
}, | |||
{ | |||
"@id": "people/Louis", | |||
"@type": "Person", | |||
"birthday" : "1978.1.1", | |||
"haircolor" : "Black", | |||
"nameFr" : "Louis", | |||
"age" : 45 | |||
}, | |||
{"edges" : [ | |||
{ | |||
"start" : "people/Jeremy", | |||
"rel" : "knows", | |||
"end" : "people/Tom" | |||
}, | |||
{ | |||
"start" : "people/Tom", | |||
"rel" : "knows", | |||
"end" : "people/Louis" | |||
}, | |||
{ | |||
"start" : "people/Louis", | |||
"rel" : "teaches", | |||
"end" : "people/Ju" | |||
}, | |||
{ | |||
"start" : "people/Ju", | |||
"rel" : "plays", | |||
"end" : "people/Jeremy" | |||
}, | |||
{ | |||
"start" : "people/Ju", | |||
"rel" : "plays", | |||
"end" : "people/Tom" | |||
} | |||
]} | |||
] | |||
} | |||
</syntaxhighlight> | |||
== Task 2 & 3) Retrieving JSON-LD from ConceptNet / Programming JSON-LD in Python == | |||
<syntaxhighlight lang="Python"> | |||
import rdflib | |||
CN_BASE = 'http://api.conceptnet.io/c/en/' | |||
g = rdflib.Graph() | |||
g.parse(CN_BASE+'indictment', format='json-ld') | |||
# To download JSON object: | |||
import json | |||
import requests | |||
json_obj = requests.get(CN_BASE+'indictment').json() | |||
# To change the @context: | |||
context = { | |||
"@base": "http://ex.org/", | |||
"edges": "http://ex.org/triple/", | |||
"start": "http://ex.org/s/", | |||
"rel": "http://ex.org/p/", | |||
"end": "http://ex.org/o/", | |||
"label": "http://ex.org/label" | |||
} | |||
json_obj['@context'] = context | |||
json_str = json.dumps(json_obj) | |||
g = rdflib.Graph() | |||
g.parse(data=json_str, format='json-ld') | |||
# To extract triples (here with labels): | |||
r = g.query(""" | |||
SELECT ?s ?sLabel ?p ?o ?oLabel WHERE { | |||
?edge | |||
<http://ex.org/s/> ?s ; | |||
<http://ex.org/p/> ?p ; | |||
<http://ex.org/o/> ?o . | |||
?s <http://ex.org/label> ?sLabel . | |||
?o <http://ex.org/label> ?oLabel . | |||
} | |||
""", initNs={'cn': CN_BASE}) | |||
print(r.serialize(format='txt').decode()) | |||
# Construct a new graph: | |||
r = g.query(""" | |||
CONSTRUCT { | |||
?s ?p ?o . | |||
?s <http://ex.org/label> ?sLabel . | |||
?o <http://ex.org/label> ?oLabel . | |||
} WHERE { | |||
?edge <http://ex.org/s/> ?s ; | |||
<http://ex.org/p/> ?p ; | |||
<http://ex.org/o/> ?o . | |||
?s <http://ex.org/label> ?sLabel . | |||
?o <http://ex.org/label> ?oLabel . | |||
} | |||
""", initNs={'cn': CN_BASE}) | |||
print(r.graph.serialize(format='ttl')) | |||
</syntaxhighlight> | |||
=SHACL (Lab 9)= | |||
<syntaxhighlight lang="Python"> | |||
from pyshacl import validate | |||
from rdflib import Graph | |||
data_graph = Graph() | |||
# parses the Turtle example from the task | |||
data_graph.parse("data_graph.ttl") | |||
prefixes = """ | |||
@prefix ex: <http://example.org/> . | |||
@prefix foaf: <http://xmlns.com/foaf/0.1/> . | |||
@prefix sh: <http://www.w3.org/ns/shacl#> . | |||
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> . | |||
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . | |||
""" | |||
shape_graph = """ | |||
ex:PUI_Shape | |||
a sh:NodeShape ; | |||
sh:targetClass ex:PersonUnderInvestigation ; | |||
sh:property [ | |||
sh:path foaf:name ; | |||
sh:minCount 1 ; #Every person under investigation has exactly one name. | |||
sh:maxCount 1 ; #Every person under investigation has exactly one name. | |||
sh:datatype rdf:langString ; #All person names must be language-tagged | |||
] ; | |||
sh:property [ | |||
sh:path ex:chargedWith ; | |||
sh:nodeKind sh:IRI ; #The object of a charged with property must be a URI. | |||
sh:class ex:Offense ; #The object of a charged with property must be an offense. | |||
] . | |||
# --- If you have more time tasks --- | |||
ex:User_Shape rdf:type sh:NodeShape; | |||
sh:targetClass ex:Indictment; | |||
# The only allowed values for ex:american are true, false or unknown. | |||
sh:property [ | |||
sh:path ex:american; | |||
sh:pattern "(true|false|unknown)" ; | |||
]; | |||
# The value of a property that counts days must be an integer. | |||
sh:property [ | |||
sh:path ex:indictment_days; | |||
sh:datatype xsd:integer; | |||
]; | |||
sh:property [ | |||
sh:path ex:investigation_days; | |||
sh:datatype xsd:integer; | |||
]; | |||
# The value of a property that indicates a start date must be xsd:date. | |||
sh:property [ | |||
sh:path ex:investigation_start; | |||
sh:datatype xsd:date; | |||
]; | |||
# The value of a property that indicates an end date must be xsd:date or unknown (tip: you can use sh:or (...) ). | |||
sh:property [ | |||
sh:path ex:investigation_end; | |||
sh:or ( | |||
[ sh:datatype xsd:date ] | |||
[ sh:hasValue "unknown" ] | |||
)]; | |||
# Every indictment must have exactly one FOAF name for the investigated person. | |||
sh:property [ | |||
sh:path foaf:name; | |||
sh:minCount 1; | |||
sh:maxCount 1; | |||
]; | |||
# Every indictment must have exactly one investigated person property, and that person must have the type ex:PersonUnderInvestigation. | |||
sh:property [ | |||
sh:path ex:investigatedPerson ; | |||
sh:minCount 1 ; | |||
sh:maxCount 1 ; | |||
sh:class ex:PersonUnderInvestigation ; | |||
sh:nodeKind sh:IRI ; | |||
] ; | |||
# No URI-s can contain hyphens ('-'). | |||
sh:property [ | |||
sh:path ex:outcome ; | |||
sh:nodeKind sh:IRI ; | |||
sh:pattern "^[^-]*$" ; | |||
] ; | |||
# Presidents must be identified with URIs. | |||
sh:property [ | |||
sh:path ex:president ; | |||
sh:minCount 1 ; | |||
sh:class ex:President ; | |||
sh:nodeKind sh:IRI ; | |||
] . | |||
""" | |||
shacl_graph = Graph() | |||
# parses the contents of a shape_graph you made in the previous task | |||
shacl_graph.parse(data=prefixes+shape_graph) | |||
# uses pySHACL's validate method to apply the shape_graph constraints to the data_graph | |||
results = validate( | |||
data_graph, | |||
shacl_graph=shacl_graph, | |||
inference='both' | |||
) | |||
# prints out the validation result | |||
boolean_value, results_graph, results_text = results | |||
# print(boolean_value) | |||
print(results_graph.serialize(format='ttl')) | |||
# print(results_text) | |||
#Write a SPARQL query to print out each distinct sh:resultMessage in the results_graph | |||
distinct_messages = """ | |||
PREFIX sh: <http://www.w3.org/ns/shacl#> | |||
SELECT DISTINCT ?message WHERE { | |||
[] sh:result / sh:resultMessage ?message . | |||
} | |||
""" | |||
messages = results_graph.query(distinct_messages) | |||
for row in messages: | |||
print(row.message) | |||
#each sh:resultMessage in the results_graph once, along with the number of times that message has been repeated in the results | |||
count_messages = """ | |||
PREFIX sh: <http://www.w3.org/ns/shacl#> | |||
SELECT ?message (COUNT(?node) AS ?num_messages) WHERE { | |||
[] sh:result ?result . | |||
?result sh:resultMessage ?message ; | |||
sh:focusNode ?node . | |||
} | |||
GROUP BY ?message | |||
ORDER BY DESC(?count) ?message | |||
""" | |||
messages = results_graph.query(count_messages) | |||
for row in messages: | |||
print("COUNT MESSAGE") | |||
print(row.num_messages, " ", row.message) | |||
</syntaxhighlight> | |||
=RDFS (Lab 10)= | |||
<syntaxhighlight lang="Python"> | |||
import owlrl | |||
from rdflib import Graph, RDF, Namespace, Literal, XSD, FOAF, RDFS | |||
from rdflib.collection import Collection | |||
g = Graph() | |||
ex = Namespace('http://example.org/') | |||
g.bind("ex", ex) | |||
g.bind("foaf", FOAF) | |||
NS = { | |||
'ex': ex, | |||
'rdf': RDF, | |||
'rdfs': RDFS, | |||
'foaf': FOAF, | |||
} | |||
#Write a small function that computes the RDFS closure on your graph. | |||
def flush(): | |||
engine = owlrl.RDFSClosure.RDFS_Semantics(g, False, False, False) | |||
engine.closure() | |||
engine.flush_stored_triples() | |||
#Rick Gates was charged with money laundering and tax evasion. | |||
g.add((ex.Rick_Gates, ex.chargedWith, ex.MoneyLaundering)) | |||
g.add((ex.Rick_Gates, ex.chargedWith, ex.TaxEvasion)) | |||
#When one thing that is charged with another thing, | |||
g.add((ex.chargedWith, RDFS.domain, ex.PersonUnderInvestigation)) #the first thing (subject) is a person under investigation and | |||
g.add((ex.chargedWith, RDFS.range, ex.Offense)) #the second thing (object) is an offense. | |||
#Write a SPARQL query that checks the RDF type(s) of Rick Gates and money laundering in your RDF graph. | |||
print(g.query('ASK {ex:Rick_Gates rdf:type ex:PersonUnderInvestigation}', initNs=NS).askAnswer) | |||
print(g.query('ASK {ex:MoneyLaundering rdf:type ex:Offense}', initNs=NS).askAnswer) | |||
flush() | |||
print(g.query('ASK {ex:Rick_Gates rdf:type ex:PersonUnderInvestigation}', initNs=NS).askAnswer) | |||
print(g.query('ASK {ex:MoneyLaundering rdf:type ex:Offense}', initNs=NS).askAnswer) | |||
#A person under investigation is a FOAF person | |||
g.add((ex.PersonUnderInvestigation, RDFS.subClassOf, FOAF.Person)) | |||
print(g.query('ASK {ex:Rick_Gates rdf:type foaf:Person}', initNs=NS).askAnswer) | |||
flush() | |||
print(g.query('ASK {ex:Rick_Gates rdf:type foaf:Person}', initNs=NS).askAnswer) | |||
#Paul Manafort was convicted for tax evasion. | |||
g.add((ex.Paul_Manafort, ex.convictedFor, ex.TaxEvasion)) | |||
#the first thing is also charged with the second thing | |||
g.add((ex.convictedFor, RDFS.subPropertyOf, ex.chargedWith)) | |||
flush() | |||
print(g.query('ASK {ex:Paul_Manafort ex:chargedWith ex:TaxEvasion}', initNs=NS).askAnswer) | |||
print(g.serialize()) | |||
</syntaxhighlight> | |||
=OWL 1 (Lab 11)= | |||
<syntaxhighlight lang="Python"> | |||
from rdflib import Graph, RDFS, Namespace, RDF, FOAF, BNode, OWL, URIRef, Literal, XSD | |||
from rdflib.collection import Collection | |||
import owlrl | |||
g = Graph() | |||
ex = Namespace('http://example.org/') | |||
schema = Namespace('http://schema.org/') | |||
dbr = Namespace('https://dbpedia.org/page/') | |||
g.bind("ex", ex) | |||
# g.bind("schema", schema) | |||
g.bind("foaf", FOAF) | |||
# Donald Trump and Robert Mueller are two different persons. | |||
g.add((ex.Donald_Trump, OWL.differentFrom, ex.Robert_Mueller)) | |||
# Actually, all the names mentioned in connection with the Mueller investigation refer to different people. | |||
b1 = BNode() | |||
b2 = BNode() | |||
Collection(g, b2, [ex.Robert_Mueller, ex.Paul_Manafort, ex.Rick_Gates, ex.George_Papadopoulos, ex.Michael_Flynn, ex.Michael_Cohen, ex.Roger_Stone, ex.Donald_Trump]) | |||
g.add((b1, RDF.type, OWL.AllDifferent)) | |||
g.add((b1, OWL.distinctMembers, b2)) | |||
# All these people are foaf:Persons as well as schema:Persons | |||
g.add((FOAF.Person, OWL.equivalentClass, schema.Person)) | |||
# Tax evation is a kind of bank and tax fraud. | |||
g.add((ex.TaxEvation, RDFS.subClassOf, ex.BankFraud)) | |||
g.add((ex.TaxEvation, RDFS.subClassOf, ex.TaxFraud)) | |||
# The Donald Trump involved in the Mueller investigation is dbpedia:Donald_Trump and not dbpedia:Donald_Trump_Jr. | |||
g.add((ex.Donald_Trump, OWL.sameAs, dbr.Donald_Trump)) | |||
g.add((ex.Donald_Trump, OWL.differentFrom, URIRef(dbr + "Donald_Trump_Jr."))) | |||
# Congress, FBI and the Mueller investigation are foaf:Organizations. | |||
g.add((ex.Congress, RDF.type, FOAF.Organization)) | |||
g.add((ex.FBI, RDF.type, FOAF.Organization)) | |||
g.add((ex.Mueller_Investigation, RDF.type, FOAF.Organization)) | |||
# Nothing can be both a person and an organization. | |||
g.add((FOAF.Person, OWL.disjointWith, FOAF.Organization)) | |||
# Leading an organization is a way of being involved in an organization. | |||
g.add((ex.leading, RDFS.subPropertyOf, ex.involved)) | |||
# Being a campaign manager or an advisor for is a way of supporting someone. | |||
g.add((ex.campaignManagerTo, RDFS.subPropertyOf, ex.supports)) | |||
g.add((ex.advisorTo, RDFS.subPropertyOf, ex.supports)) | |||
# Donald Trump is a politician and a Republican. | |||
g.add((ex.Donald_Trump, RDF.type, ex.Politician)) | |||
g.add((ex.Donald_Trump, RDF.type, ex.Republican)) | |||
# A Republican politician is both a politician and a Republican. | |||
g.add((ex.RepublicanPolitician, RDFS.subClassOf, ex.Politician)) | |||
g.add((ex.RepublicanPolitician, RDFS.subClassOf, ex.Republican)) | |||
#hasBusinessPartner | |||
g.add((ex.Paul_Manafort, ex.hasBusinessPartner, ex.Rick_Gates)) | |||
g.add((ex.hasBusinessPartner, RDF.type, OWL.SymmetricProperty)) | |||
g.add((ex.hasBusinessPartner, RDF.type, OWL.IrreflexiveProperty)) | |||
#adviserTo | |||
g.add((ex.Michael_Flynn, ex.adviserTo, ex.Donald_Trump)) | |||
g.add((ex.adviserTo, RDF.type, OWL.IrreflexiveProperty)) | |||
# Not necessarily asymmetric as it's not a given that they couldn't be advisors to each other | |||
#wasLyingTo | |||
g.add((ex.Rick_Gates_Lying, ex.wasLyingTo, ex.FBI)) | |||
g.add((ex.wasLyingTo, RDF.type, OWL.IrreflexiveProperty)) | |||
# Not asymmetric as the subject and object could lie to each other; also in this context, the FBI can lie to you | |||
#presidentOf | |||
g.add((ex.Donald_Trump, ex.presidentOf, ex.USA)) | |||
g.add((ex.presidentOf, RDF.type, OWL.AsymmetricProperty)) | |||
g.add((ex.presidentOf, RDF.type, OWL.IrreflexiveProperty)) | |||
g.add((ex.presidentOf, RDF.type, OWL.FunctionalProperty)) #can only be president of one country | |||
#not inversefunctionalproperty as Bosnia has 3 presidents https://www.culturalworld.org/do-any-countries-have-more-than-one-president.htm | |||
#hasPresident | |||
g.add((ex.USA, ex.hasPresident, ex.Donald_Trump)) | |||
g.add((ex.hasPresident, RDF.type, OWL.AsymmetricProperty)) | |||
g.add((ex.hasPresident, RDF.type, OWL.IrreflexiveProperty)) | |||
g.add((ex.hasPresident, RDF.type, OWL.InverseFunctionalProperty)) #countries do not share their president with another | |||
#not functionalproperty as a country (Bosnia) can have more than one president | |||
#Closure | |||
owlrl.DeductiveClosure(owlrl.OWLRL_Semantics).expand(g) | |||
#Serialization | |||
print(g.serialize(format="ttl")) | |||
# g.serialize("lab8.xml", format="xml") #serializes to XML file | |||
</syntaxhighlight> | |||
=OWL 2 (Lab 12)= | |||
<syntaxhighlight lang="Python"> | |||
@prefix : <http://www.semanticweb.org/bruker/ontologies/2023/2/InvestigationOntology#> . | |||
@prefix dc: <http://purl.org/dc/terms#> . | |||
@prefix io: <http://www.semanticweb.org/bruker/ontologies/2023/2/InvestigationOntology#> . | |||
@prefix dbr: <http://dbpedia.org/resource/> . | |||
@prefix owl: <http://www.w3.org/2002/07/owl#> . | |||
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . | |||
@prefix xml: <http://www.w3.org/XML/1998/namespace> . | |||
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> . | |||
@prefix foaf: <http://xmlns.com/foaf/0.1/> . | |||
@prefix prov: <http://www.w3.org/ns/prov#> . | |||
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . | |||
@base <http://www.semanticweb.org/bruker/ontologies/2023/2/InvestigationOntology#> . | |||
<http://www.semanticweb.org/bruker/ontologies/2023/2/InvestigationOntology> rdf:type owl:Ontology . | |||
################################################################# | |||
# Object Properties | |||
################################################################# | |||
### http://www.semanticweb.org/bruker/ontologies/2023/2/InvestigationOntology#indictedIn | |||
io:indictedIn rdf:type owl:ObjectProperty ; | |||
rdfs:subPropertyOf io:involvedIn ; | |||
rdfs:domain io:InvestigatedPerson ; | |||
rdfs:range io:Investigation . | |||
### http://www.semanticweb.org/bruker/ontologies/2023/2/InvestigationOntology#investigating | |||
io:investigating rdf:type owl:ObjectProperty ; | |||
rdfs:subPropertyOf io:involvedIn ; | |||
rdfs:domain io:Investigator ; | |||
rdfs:range io:Investigation . | |||
### http://www.semanticweb.org/bruker/ontologies/2023/2/InvestigationOntology#involvedIn | |||
io:involvedIn rdf:type owl:ObjectProperty ; | |||
rdfs:domain foaf:Person ; | |||
rdfs:range io:Investigation . | |||
### http://www.semanticweb.org/bruker/ontologies/2023/2/InvestigationOntology#leading | |||
io:leading rdf:type owl:ObjectProperty ; | |||
rdfs:subPropertyOf io:investigating ; | |||
rdfs:domain io:InvestigationLeader ; | |||
rdfs:range io:Investigation . | |||
################################################################# | |||
# Data properties | |||
################################################################# | |||
### http://purl.org/dc/elements/1.1/description | |||
<http://purl.org/dc/elements/1.1/description> rdf:type owl:DatatypeProperty ; | |||
rdfs:domain io:Investigation ; | |||
rdfs:range xsd:string . | |||
### http://www.w3.org/ns/prov#endedAtTime | |||
prov:endedAtTime rdf:type owl:DatatypeProperty , | |||
owl:FunctionalProperty ; | |||
rdfs:domain io:Investigation ; | |||
rdfs:range xsd:dateTime . | |||
### http://www.w3.org/ns/prov#startedAtTime | |||
prov:startedAtTime rdf:type owl:DatatypeProperty , | |||
owl:FunctionalProperty ; | |||
rdfs:domain io:Investigation ; | |||
rdfs:range xsd:dateTime . | |||
### http://xmlns.com/foaf/0.1/name | |||
foaf:name rdf:type owl:DatatypeProperty ; | |||
rdfs:domain foaf:Person ; | |||
rdfs:range xsd:string . | |||
### http://xmlns.com/foaf/0.1/title | |||
foaf:title rdf:type owl:DatatypeProperty ; | |||
rdfs:domain io:Investigation ; | |||
rdfs:range xsd:string . | |||
################################################################# | |||
# Classes | |||
################################################################# | |||
### http://www.semanticweb.org/bruker/ontologies/2023/2/InvestigationOntology#InvestigatedPerson | |||
io:InvestigatedPerson rdf:type owl:Class ; | |||
rdfs:subClassOf io:Person ; | |||
owl:disjointWith io:Investigator . | |||
### http://www.semanticweb.org/bruker/ontologies/2023/2/InvestigationOntology#Investigation | |||
io:Investigation rdf:type owl:Class . | |||
### http://www.semanticweb.org/bruker/ontologies/2023/2/InvestigationOntology#InvestigationLeader | |||
io:InvestigationLeader rdf:type owl:Class ; | |||
rdfs:subClassOf io:Investigator . | |||
### http://www.semanticweb.org/bruker/ontologies/2023/2/InvestigationOntology#Investigator | |||
io:Investigator rdf:type owl:Class ; | |||
rdfs:subClassOf io:Person . | |||
### http://www.semanticweb.org/bruker/ontologies/2023/2/InvestigationOntology#Person | |||
io:Person rdf:type owl:Class ; | |||
rdfs:subClassOf foaf:Person . | |||
### http://xmlns.com/foaf/0.1/Person | |||
foaf:Person rdf:type owl:Class . | |||
################################################################# | |||
# Individuals | |||
################################################################# | |||
### http://dbpedia.org/resource/Donald_Trump | |||
dbr:Donald_Trump rdf:type owl:NamedIndividual ; | |||
foaf:name "Donald Trump" . | |||
### http://dbpedia.org/resource/Elizabeth_Prelogar | |||
dbr:Elizabeth_Prelogar rdf:type owl:NamedIndividual ; | |||
io:investigating <http://dbpedia.org/resource/Special_Counsel_investigation_(2017–2019)> ; | |||
foaf:name "Elizabeth Prelogar" . | |||
### http://dbpedia.org/resource/Michael_Flynn | |||
dbr:Michael_Flynn rdf:type owl:NamedIndividual ; | |||
foaf:name "Michael Flynn" . | |||
### http://dbpedia.org/resource/Paul_Manafort | |||
dbr:Paul_Manafort rdf:type owl:NamedIndividual ; | |||
io:indictedIn <http://dbpedia.org/resource/Special_Counsel_investigation_(2017–2019)> ; | |||
foaf:name "Paul Manafort" . | |||
### http://dbpedia.org/resource/Robert_Mueller | |||
dbr:Robert_Mueller rdf:type owl:NamedIndividual ; | |||
io:leading <http://dbpedia.org/resource/Special_Counsel_investigation_(2017–2019)> ; | |||
foaf:name "Robert Mueller" . | |||
### http://dbpedia.org/resource/Roger_Stone | |||
dbr:Roger_Stone rdf:type owl:NamedIndividual ; | |||
foaf:name "Roger Stone" . | |||
### http://dbpedia.org/resource/Special_Counsel_investigation_(2017–2019) | |||
<http://dbpedia.org/resource/Special_Counsel_investigation_(2017–2019)> rdf:type owl:NamedIndividual ; | |||
foaf:title "Mueller Investigation" . | |||
################################################################# | |||
# General axioms | |||
################################################################# | |||
[ rdf:type owl:AllDifferent ; | |||
owl:distinctMembers ( dbr:Donald_Trump | |||
dbr:Elizabeth_Prelogar | |||
dbr:Michael_Flynn | |||
dbr:Paul_Manafort | |||
dbr:Robert_Mueller | |||
dbr:Roger_Stone | |||
) | |||
] . | |||
### Generated by the OWL API (version 4.5.25.2023-02-15T19:15:49Z) https://github.com/owlcs/owlapi | |||
</syntaxhighlight> | |||
=Using Graph Embeddings (Lab 13)= | |||
https://colab.research.google.com/drive/1WkRJUeUBVF5yVv7o0pOKfsd4pqG6369k | |||
=Training Graph Embeddings (Lab 14)= | |||
https://colab.research.google.com/drive/1jKpzlQ7gYTVzgphJsrK5iuMpFhkrY96q | |||
--> |
Latest revision as of 10:56, 20 January 2025
Here we will present suggested solutions after each lab. The page will be updated as the course progresses