SPARQL-запрос с использованием локального хранилища RDF
Я пытаюсь создать запрос SPARQL, используя локальный график RDF. Но это не работает. Я включил мой код ниже мой код.
У меня есть два класса под названием Студент и Университет. Студенческий класс имеет два атрибута (enrolledOn и StudiesAt). Университетский класс также имеет два атрибута (UniversityLocation и UniversityRanking). Кроме того, я ввел некоторые данные (тройки RDF). И в классе ученика, и в университете есть три объекта данных каждый.
Мой SPARQL-запрос находится внизу. Я хочу выбрать всех студентов, которые учатся в 10 лучших университетах. Но на данный момент мой SPARQL-запрос ничего не возвращает. Запрос должен вернуть Халила и Ахмеда.
Любая помощь будет высоко ценится. Спасибо.
Мой код:
import rdfextras
import rdflib
from rdflib.graph import Graph, Store, URIRef, Literal
from rdflib.namespace import Namespace, RDFS
from rdflib import plugin
from SPARQLWrapper import SPARQLWrapper, JSON
rdflib.plugin.register('sparql', rdflib.query.Processor,
'rdfextras.sparql.processor', 'Processor')
rdflib.plugin.register('sparql', rdflib.query.Result,
'rdfextras.sparql.query', 'SPARQLQueryResult')
#=====================data for STUDENT class==============================
rdf_xml_Student_data = """<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:Student="http://www.semanticweb.org/ontologies/2013/2/Coursework.owl/Thing/Person/Student#">
<rdf:Description rdf:about="http://www.semanticweb.org/ontologies/2013/2/Coursework.owl/Thing/Person/Student/Harith">
<Student:enrolledOn>MScComputerScience</Student:enrolledOn>
<Student:studiesAt>Queen_Mary</Student:studiesAt>
</rdf:Description>
<rdf:Description rdf:about="http://www.semanticweb.org/ontologies/2013/2/Coursework.owl/Thing/Person/Student/Khalil">
<Student:enrolledOn>BScComputerScience</Student:enrolledOn>
<Student:studiesAt>Oxford_University</Student:studiesAt>
</rdf:Description>
<rdf:Description rdf:about="http://www.semanticweb.org/ontologies/2013/2/Coursework.owl/Thing/Person/Student/Ahmed">
<Student:enrolledOn>BScComputerScience</Student:enrolledOn>
<Student:studiesAt>Oxford_University</Student:studiesAt>
</rdf:Description>
</rdf:RDF>
"""
#=====================data for UNIVERSITY class==============================
rdf_xml_University_data = """<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:University="http://www.semanticweb.org/ontologies/2013/2/Coursework.owl/Thing/University#">
<rdf:Description rdf:about="http://www.semanticweb.org/ontologies/2013/2/Coursework.owl/Thing/University/Queen_Mary">
<University:UniversityLocation>London</University:UniversityLocation>
<University:UniversityRanking>36</University:UniversityRanking>
</rdf:Description>
<rdf:Description rdf:about="http://www.semanticweb.org/ontologies/2013/2/Coursework.owl/Thing/University/City_University">
<University:UniversityLocation>London</University:UniversityLocation>
<University:UniversityRanking>43</University:UniversityRanking>
</rdf:Description>
<rdf:Description rdf:about="http://www.semanticweb.org/ontologies/2013/2/Coursework.owl/Thing/University/Oxford_University">
<University:UniversityLocation>Oxford</University:UniversityLocation>
<University:UniversityRanking>2</University:UniversityRanking>
</rdf:Description>
</rdf:RDF>
"""
# -- (part1) create and RDF store in memory --
memory_store = plugin.get('IOMemory', Store)()
graph_id = URIRef(u'http://example.com/foo')
g = Graph(store=memory_store, identifier=graph_id)
g.bind('ex','http://example.com/')
g.parse(data=rdf_xml_Student_data, format="application/rdf+xml")
g.parse(data=rdf_xml_University_data, format="application/rdf+xml")
#===========================SPARQL QUERY====================================
# QUERY - select all students who study at top 10 ranked universities
results = g.query("""PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX student: <http://www.semanticweb.org/ontologies/2013/2/Coursework.owl/Thing/Person/Student#>
PREFIX university: <http://www.semanticweb.org/ontologies/2013/2/Coursework.owl/Thing/University#>
SELECT ?stu
WHERE { ?uni university:UniversityRanking ?UniversityRanking.
?stu student:studiesAt ?uni.
FILTER ( ?UniversityRanking < 10)
}
""")
print("\n============QUERY RESULTS===============\n")
for row in results.result:
print(row)
Вот как тройки будут храниться на графике после запуска приведенного выше кода:
=========================STUDENT class==================================
Subject Predicate Object
========================================================================
Harith enrolledOn MScComputerScience
Harith studiesAt Queen_Mary
Khalil enrolledOn BScComputerScience
Khalil studiesAt Oxford_University
Ahmed enrolledOn BScComputerScience
Ahmed studiesAt Oxford_University
=============================UNIVERSITY class=======================
Subject Predicate Object
===============================================================
Queen_Mary UniversityLocation London
Queen_Mary UniversityRanking 36
City_University UniversityLocation London
City_University UniversityRanking 43
Oxford_University UniversityLocation Oxford
Oxford_University UniversityRanking 2
3 ответа
Вы должны посмотреть на ответ Робва на этот вопрос, приведя значение UniversityRanking к целому числу.
Не совсем ответ, но если вам не RDFLib более 3-4 лет, ваш код может быть намного проще:
from rdflib import Graph
#=====================data for STUDENT class==============================
rdf_xml_Student_data = """<?xml version="1.0"?> ... <snip>"""
#=====================data for UNIVERSITY class==============================
rdf_xml_University_data = """<?xml version="1.0"?> ... <snip>"""
# -- (part1) create and RDF store in memory --
g = Graph()
g.parse(data=rdf_xml_Student_data)
g.parse(data=rdf_xml_University_data)
#===========================SPARQL QUERY====================================
# QUERY - select all students who study at top 10 ranked universities
results = g.query("""PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX student: <http://www.semanticweb.org/ontologies/2013/2/Coursework.owl/Thing/Person/Student#>
PREFIX university: <http://www.semanticweb.org/ontologies/2013/2/Coursework.owl/Thing/University#>
SELECT ?stu
WHERE { ?uni university:UniversityRanking ?UniversityRanking.
?stu student:studiesAt ?uni.
FILTER ( ?UniversityRanking < 10)
}
""")
print("\n============QUERY RESULTS===============\n")
for row in results.result:
print(row)
?stu student:studiesAt ?uni.
в данных вашего студента соответствует литеральная строка. В ваших университетских данных вы используете URI.
Хороший способ начать - распечатать каждый набор данных в Turtle или N-Triples, чтобы увидеть истинную структуру. С RDF/XML сложно работать.