【问题标题】:REST API for SPARQL in Django (Python)?Django(Python)中用于 SPARQL 的 REST API?
【发布时间】:2020-11-07 18:13:11
【问题描述】:

简介

我今天给你带来的挑战是:实现一个Real Rime REST APIGETPOSTPUTDELETE等)来查询update 任何 SPARQL 端点使用 Django REST Framework 用于前端应用程序(我正在使用 React) 来请求和使用 REST API 提供的序列化数据。

请注意,我使用 Django 是因为我想在未来实现 WebMobile 应用程序,但现在我只在 WebMobile 应用程序上实现它。 strong>React Web 应用程序。

规格

REST API 应该能够:

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

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

我的意思是 实时 API

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

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

  1. 然后(假设地)修改或更新三元组(本地或远程)。
  2. 现在本地三元组与远程三元组不同步
  3. REST API 现在可以了解此更新(可能通过 Listener/Observer 对象?)。
  4. REST API 然后通过更新查询请求(如果在本地进行更改)或更新 Python 自动同步三元组strong> 带有查询请求响应的对象(如果更新是远程进行的)。
  5. 最后,(SPARQL 端点和 Python 对象)都应该共享最新更新的三元组,因此,它们处于 同步

以前的尝试

我目前已经能够使用 SPARQLWrapper 包(用于执行查询)以及 RDFLibJSON 包来查询 SPARQL 端点用于从响应中序列化和实例化 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/>"""))

挑战

前面的代码解决已经可以了:

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

但仍然无法实现这些其他方面:

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

最后但并非最不重要的是,它完全未能实现这一挑战的实时方面。

问题:

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

非常感谢!

【问题讨论】:

    标签: python reactjs django-rest-framework sparql rdflib


    【解决方案1】:

    抱歉,我对 Django 了解不多,因此无法在这里回答 Django 的具体情况。

    但是,我可以这样说:SPARQL 有一个 HTTP 交互规范 (https://www.w3.org/TR/sparql11-protocol/),它告诉您使用 sparql?query=...sparql?update... 样式 URI 来查询商店,那么为什么要定义一种新的做事方式store.query & store.graph_query 等的东西?

    有 Django 特定的原因吗?

    您现在可以使用 React 或任何您想要的方式向 SPARQL 端点提出问题,就像它一样。

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

    有关独立的 JS SPARQL 客户端,请参阅 YASGUI (https://triply.cc/docs/yasgui)。

    【讨论】:

      猜你喜欢
      • 2014-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-03
      • 2015-01-19
      • 1970-01-01
      • 1970-01-01
      • 2019-03-09
      相关资源
      最近更新 更多