postgresql - 如何从 Python RDFLib 加速 SPARQL 查询?

标签 postgresql sqlalchemy sparql flask-sqlalchemy rdflib

我使用 rdflib_sqlalchemy.SQLAlchemy 在 PostgreSQL 表中加载了一个大型 RDF 数据集(Geonames 数据集:18GB)。

我在支持 RDFLib 的 Python 脚本中运行了以下简单查询。花了两个多小时才给我结果。 有什么方法可以在不将 RDF 数据注入(inject)三元组(例如 Virtuoso)的情况下使其更快?

mystore = store.SQLAlchemy(configuration="postgresql://localhost:5873/postgres")
g = Graph(mystore, identifier="test")
results = g.query("""SELECT ?s ?p ?o WHERE {?s ?p ?o .} LIMIT 1""")
for row in results:
  print row

我正在处理集群的计算节点。我也尝试使用内存中的数据执行查询,如下所示。但是,它仍然很慢。

g = Graph()
g.parse('geonames.nt', format='nt')
results = g.query("""SELECT ?s ?p ?o WHERE {?s ?p ?o .} LIMIT 1""")
for row in results:
  print row  

请告诉我您的意见。感谢您的帮助。

最佳答案

分析您的代码,很可能它的慢是加载所有这些数据,因为查询非常简单并且有 LIMIT 1。

通常,这种大小的数据集是通过一些适当的三元组存储来管理的,数据可以在其中持久保存并经常索引,从而加快查询速度。

此外,像 Virtuoso 这样的系统支持并行加载。以某种方式拆分初始数据文件(取决于它们代表什么)然后将两个或更多子集存储到多个三元组存储中可能是另一种方法(即使您决定保持内存加载也可以这样做)。

同一个三元组存储中的多个图也可能有帮助。

关于postgresql - 如何从 Python RDFLib 加速 SPARQL 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41820363/

相关文章:

sql - 我们可以减少更新语句中两个子查询之间的冗余吗?

java - Liquibase <sql> 命令给出的结果与直接在 SQL 中运行的结果不同

python - Sqlalchemy:打印表的内容

java - Sparql 关系请求

Protege中的“SPARQL查询”选项卡不显示任何内容

postgresql - 基于另一个属性的自动增量属性

postgresql - 尝试在sql脚本中传递参数的postgres psql错误

python - SQLAlchemy for Python, 'Query' 对象没有属性 'fetchone'

python - 带有 Flask 和 Flask-SQLAlchemy 的 Celery 无法更新数据库记录

java - 当我在 DBPedia 上运行查询时 CATCH block 中的条件