【问题标题】:SPARQL query using a local RDF store使用本地 RDF 存储的 SPARQL 查询
【发布时间】:2013-05-08 00:37:11
【问题描述】:

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

我有两个班级,学生和大学。学生类有两个属性(enrolledOn 和 studyAt)。 University 类也有两个属性(UniversityLocation 和 UniversityRanking)。此外,我输入了一些数据(RDF 三元组)。 Student 类和 University 类均具有 三个 数据实体。

我的 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

【问题讨论】:

    标签: python sparql triplestore rdflib rdfstore


    【解决方案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】:

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

      【讨论】:

      • 我尝试了 Robv 的回答,但不幸的是它没有用。顺便谢谢你的回答。
      【解决方案3】:
      ?stu student:studiesAt ?uni.
      

      在您的学生数据中匹配一个文字字符串。在您的大学数据中,您使用 URI。

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

      【讨论】:

      • 我第二次查看turtle中的数据。您可以使用g.serialize(format='turtle') 轻松地使 RDFLib 再次将图形序列化为海龟
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多