Django(Python)中SPARQL的RESTAPI? 介绍

Django(Python)中SPARQL的RESTAPI? 介绍,python,reactjs,django-rest-framework,sparql,rdflib,Python,Reactjs,Django Rest Framework,Sparql,Rdflib,我今天给大家带来的挑战是:为前端应用程序使用Django REST框架来实现查询和更新任何SPARQL端点的Real-Rime REST API(GET、POST、PUT、删除,等等)(我正在使用React)请求并使用restapi提供的序列化数据 请注意,我之所以使用Django,是因为我希望将来实现Web和Mobile应用程序,但现在我只在React Web应用程序上实现它 规格 REST API应该能够: 通过HTTP请求对SPARQL端点执行(读取或更新)查询 根据HTTP响应,序列化

我今天给大家带来的挑战是:为前端应用程序使用Django REST框架来实现查询更新任何SPARQL端点的Real-Rime REST API
GET
POST
PUT
删除
,等等)(我正在使用React)请求并使用restapi提供的序列化数据

请注意,我之所以使用Django,是因为我希望将来实现WebMobile应用程序,但现在我只在React Web应用程序上实现它

规格 REST API应该能够:

  • 通过HTTP请求对SPARQL端点执行(读取或更新)查询
  • 根据HTTP响应,序列化对JSONRDF标准化表或RDF图的响应
  • 将序列化响应存储在Python对象中
  • 为端点提供对前端应用程序(如React)的序列化响应
  • 处理来自前端应用程序的传入请求,“翻译”并作为SPARQL查询执行
  • 将响应发送回前端应用程序的请求
所有这些同时实时执行所有查询和更新

我指的是实时API:
  • SPARQL查询通过HTTP请求从restapi执行到SPARQL端点
  • restapi读取从请求生成的HTTP响应
  • RESTAPI将响应序列化为相应的格式
  • 此序列化响应存储在本地的Python对象中,以备将来使用
  • (注意:查询中SPARQL端点的所有三元组现在都存在于SPARQL端点以及Python对象中,并且在本地和远程都是一致的。)

  • 然后(假设)修改或更新三元组(本地或远程)
  • 现在,本地三元组与远程三元组不同步
  • restapi现在会意识到这个更新(可能是通过侦听器/观察者对象?)
  • restapi然后通过更新查询请求(如果本地进行了更改)或通过使用查询请求的响应(如果远程进行了更新)更新Python对象,自动同步这些三元组
  • 最后,两者(SPARQL端点和Python对象)都应该共享最新更新的三元组,因此处于同步状态
  • 以前的尝试 目前,我已经能够使用
    SPARQLWrapper
    包(用于执行查询)查询SPARQL端点,以及
    RDFLib
    JSON
    包从响应中序列化和实例化Python对象,如下所示:

    import json
    
    from rdflib import RDFS, Graph
    
    from SPARQLWrapper import GET, JSON, JSONLD, POST, TURTLE, SPARQLWrapper
    
    
    class Store(object):
        def __init__(self, query_endpoint, update_endpoint=None):
            self.query_endpoint = query_endpoint
            self.update_endpoint = update_endpoint
            self.sparql = SPARQLWrapper(query_endpoint, update_endpoint)
    
        def graph_query(self, query: str, format=JSONLD, only_conneg=True):
            results = self.query(query, format, only_conneg) 
            results_bytes = results.serialize(format=format)
            results_json = results_bytes.decode('utf8').replace("'", '"')
            data = json.loads(results_json)
            return data
    
        def query(self, query: str, format=JSON, only_conneg=True):
            self.sparql.resetQuery()
            self.sparql.setMethod(GET)
            self.sparql.setOnlyConneg(only_conneg)
            self.sparql.setQuery(query)
            self.sparql.setReturnFormat(format)
            return self.sparql.queryAndConvert()
    
        def update_query(self, query: str, only_conneg=True):
            self.sparql.resetQuery()
            self.sparql.setMethod(POST)
            self.sparql.setOnlyConneg(only_conneg)
            self.sparql.setQuery(query)
            self.sparql.query()
    
    
    store = Store('http://www.example.com/sparql/Example')
    print(store.query("""SELECT ?s WHERE {?s ?p ?o} LIMIT 1"""))
    print(store.graph_query("""DESCRIBE <http://www.example.com/sparql/Example/>"""))
    
    导入json
    从rdflib导入RDFS,图形
    从SPARQLWrapper导入GET、JSON、JSONLD、POST、TURTLE、SPARQLWrapper
    类存储(对象):
    def_uuuinit_uuu(self,query_端点,update_端点=None):
    self.query\u endpoint=query\u endpoint
    self.update\u endpoint=更新\u endpoint
    self.sparql=SPARQLWrapper(查询\端点,更新\端点)
    def graph_query(self,query:str,format=JSONLD,only_conneg=True):
    结果=self.query(查询,格式,仅\u conneg)
    结果\u字节=结果。序列化(格式=格式)
    results_json=results_bytes.decode('utf8')。replace(“,”)
    data=json.load(results\u json)
    返回数据
    def查询(self,query:str,format=JSON,only_conneg=True):
    self.sparql.resetQuery()
    self.sparql.setMethod(GET)
    self.sparql.setonlyconnect(仅用于连接)
    self.sparql.setQuery(查询)
    self.sparql.setReturnFormat(格式)
    返回self.sparql.queryAndConvert()
    def update_查询(self,查询:str,仅_conneg=True):
    self.sparql.resetQuery()
    self.sparql.setMethod(POST)
    self.sparql.setonlyconnect(仅用于连接)
    self.sparql.setQuery(查询)
    self.sparql.query()
    商店=商店('http://www.example.com/sparql/Example')
    打印(store.query(“'SELECT?s WHERE{s?p?o}LIMIT 1”“”)
    打印(store.graph\u查询(““描述”)
    
    挑战 前面的代码已经可以:

    • 通过HTTP请求对SPARQL端点执行(读取或更新)查询
    • 根据HTTP响应,序列化对JSON RDF标准化表或RDF图的响应
    • 将序列化响应存储在Python对象中。
    但其他方面仍然没有落实:

    • 为端点提供对前端应用程序(如React)的序列化响应。 处理来自前端应用程序的传入请求,“翻译”并作为SPARQL查询执行**
    • 返回对前端应用程序请求的响应。
    最后,但并非最不重要的一点是,它无法实现这一挑战的实时方面

    问题是:
    • 您将如何实现这一点
    • 这真的是最好的方法吗
    • 可以优化已经运行的代码吗
    • 有什么东西已经做到了吗
    非常感谢