Django(Python)中SPARQL的RESTAPI?

2024-10-03 17:23:45 发布

您现在位置:Python中文网/ 问答频道 /正文

导言

我今天给大家带来的挑战是:使用Django REST框架为前端应用程序实现查询更新任何SPARQL端点(我正在使用React)请求并使用RESTAPI提供的序列化数据

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

规格

REST API应该能够:

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

所有这些同时实时执行所有查询和更新

我对实时API的意思是:

  1. SPARQL查询通过HTTP请求从restapi执行到SPARQL端点
  2. restapi读取从请求生成的HTTP响应
  3. RESTAPI将响应序列化为相应的格式
  4. 此序列化响应存储在本地的Python对象中,以备将来使用

(注意:查询中SPARQL端点的所有三元组现在都存在于SPARQL端点以及Python对象中,并且在本地和远程都是一致的。)

  1. 然后(假设)修改或更新三元组(本地或远程)
  2. 现在,本地三元组与远程三元组不同步
  3. restapi现在可以意识到此更新(可能通过侦听器/观察者对象?)
  4. restapi然后通过更新查询请求(如果本地进行了更改)或通过使用查询请求的响应(如果远程进行了更新)更新Python对象,自动同步这些三元组
  5. 最后,两者(SPARQL端点和Python对象)都应该共享最新更新的三元组,因此处于同步状态

以前的尝试

目前,我已经能够使用SPARQLWrapper包(用于执行查询)以及RDFLibJSON包(用于序列化和实例化响应中的Python对象)查询SPARQL端点,如下所示:

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/>"""))

挑战

前面的代码已经可以:

  • 通过HTTP请求对SPARQL端点执行(读取或更新)查询
  • 根据HTTP响应,序列化对JSON RDF标准化表或RDF图的响应
  • 将序列化响应存储在Python对象中。

但其他方面仍然没有落实:

  • 为端点提供对前端应用程序(如React)的序列化响应。 处理来自前端应用程序的传入请求,“转换”并作为SPARQL查询执行。**
  • 返回对前端应用程序请求的响应。

最后,但并非最不重要的一点是,它无法实现这一挑战的实时方面

问题是:

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

非常感谢你


Tags: 对象self应用程序formathttponly序列化端点
1条回答
网友
1楼 · 发布于 2024-10-03 17:23:45

对不起,我对Django不太了解,所以不能在这里回答Django的具体情况

但是,我可以这样说:SPARQL有一个HTTP交互规范(https://www.w3.org/TR/sparql11-protocol/),它告诉您使用sparql?query=...&sparql?update...风格的uri用于查询存储,那么为什么要定义一种使用{}的新方法&store.graph_query等等

有没有Django的具体原因

您现在已经可以使用React或任何您想要的工具向SPARQL端点提出问题,就像现在一样

您说过缺少的是“提供具有序列化响应的端点”,但SPARQL响应是这样的!SPARQL查询响应格式在规范中定义(例如JSON:https://www.w3.org/TR/sparql11-results-json/),SPARQLWrapper知道如何将它们解析为Python对象。其他语言库,比如JavaScript中的rdflib.js也知道

请参见YASGUI(https://triply.cc/docs/yasgui),了解独立JS SPARQL客户端

相关问题 更多 >