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 сложно работать.

Другие вопросы по тегам