使用本地RDF存储的SPARQL查询

时间:2013-04-20 17:20:37

标签: python sparql triplestore rdflib rdfstore

我正在尝试使用本地RDF图创建SPARQL查询。但它不起作用。我在下面包含了我的代码是我的代码。

我有两个名为学生和大学的课程。学生班有两个属性(enrolledOn和studiesAt)。大学课程还有两个属性(UniversityLocation和UniversityRanking)。此外,我输入了一些数据(RDF三元组)。学生班和大学班各有三个数据实体。

我的SPARQL查询位于底部。我想选择所有在排名前10位的大学学习的学生。但目前,我的SPARQL查询没有返回任何内容。查询应该返回Khalil和Ahmed。

任何帮助将不胜感激。谢谢。

我的代码:

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 个答案:

答案 0 :(得分:1)

您应该查看Robv在this question上的答案,将您的UniversityRanking值转换为整数。

答案 1 :(得分: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)

答案 2 :(得分:0)

?stu student:studiesAt ?uni.
学生数据中的

与文字字符串匹配。在您的逆境数据中,您使用URI。

一个好的开始方法是打印出Turtle或N-Triples中的每组数据,以查看真实的结构。 RDF / XML很难使用。