2013-04-20 3 views
1

Я пытаюсь создать запрос 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 

ответ

0
?stu student:studiesAt ?uni. 

в ваших данных студентов соответствует строке литералы , В ваших данных о небрежности вы используете URI.

Хороший способ начать - распечатать каждый набор данных в Turtle или N-Triples, чтобы увидеть истинную структуру. С RDF/XML сложно работать.

+0

Я второй глядя на данные в черепаху. Вы можете легко сделать RDFLib сериализовать график как черепаху снова с помощью '' 'g.serialize (format = 'turtle')' '' – gromgull

1

Вы должны посмотреть на ответ Робва на this question, введя значение UniversityRanking как целое число.

+0

Я пробовал ответ Робва, но он не работал, к сожалению. Спасибо за ваш ответ. – Harith

1

Не совсем ответ, но если вы 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) 
Смежные вопросы