我使用 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/