为什么我的SPARQL查询这么慢?

时间:2015-11-05 09:25:00

标签: rdf sparql

我试图通过SPARQL界面(Interface hereschema here)从欧盟全体辩论的数据库中获取大量查询。当我这样做时,我想找回发言人的姓名,他们的祖国和他们的部分名称。 每个议程项目需要5分钟才能完成,这似乎很慢。我在查询中发现任何明显的错误,这会让它变慢吗?

SELECT ?text (SAMPLE(?speaker) AS ?speaker) (SAMPLE(?given) AS ?given) (SAMPLE(?surname) AS ?surname) (SAMPLE(?acronym) AS ?country) (SAMPLE(?partyLabel) AS ?partyLabel) (SAMPLE(?type) AS ?type)
WHERE {
   <http://purl.org/linkedpolitics/eu/plenary/2010-12-16_AgendaItem_4> dcterms:hasPart ?speech.
   ?speech lpv:speaker ?speaker.
   ?speaker foaf:givenName ?given.
   ?speaker foaf:familyName ?surname.
   ?speaker lpv:countryOfRepresentation ?country.
   ?country lpv:acronym ?acronym.
   ?speech lpv:translatedText ?text.
   ?speaker lpv:politicalFunction ?func.
   ?func lpv:institution ?institution.
   ?institution rdfs:label ?partyLabel.
   ?institution rdf:type ?type.
   FILTER(langMatches(lang(?text), "en"))
} GROUP BY ?text

注意,将?speech lpv:translatedText ?text.更改为?speech lpv:textt ?text.会将查询时间缩短为30秒。

1 个答案:

答案 0 :(得分:2)

您的SPARQL查询看起来没有什么特别的错误,并且没有明显的错误(除了我后面讨论的一些语法有效性问题)

问题似乎是您正在使用的SPARQL服务使用的三重存储不能很好地处理具有大量连接的查询。在尝试查询时,移动三元模式会在SPARQL服务中产生堆栈溢出!

我建议您自己从http://linkedpolitics.ops.few.vu.nl/home下载数据 - 关于数据部分的第3点下有链接,您可以从中自行下载数据。然后,您可以将其加载到您选择的三重存储中,然后针对该存储运行查询。

例如,我下载了数据并将其放入Apache Jena Fuseki免责声明 - 我在Apache Jena项目上工作),并且能够在我修复查询后几乎立即运行查询要正确有效的SPARQL。

使查询有效SPARQL

给定的查询不是严格有效的SPARQL,因此您需要更正它以便在其他位置运行它。

首先,查询未定义使用的各种前缀,因为您使用的服务会自动插入它们,以便针对另一个三重存储运行此查询,您需要将以下内容添加到查询的开头:

PREFIX dcterms: <http://purl.org/dc/terms/> 
PREFIX foaf: <http://xmlns.com/foaf/0.1/> 
PREFIX lpv: <http://purl.org/linkedpolitics/vocabulary/> 
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 

如果给定的变量名已在范围内,则执行变量赋值也是不合法的,例如(SAMPLE(?speaker) AS ?speaker)所以需要改变:

(SAMPLE(?speaker) AS ?speaker1)

这导致以下有效且可移植的SPARQL查询:

PREFIX dcterms: <http://purl.org/dc/terms/> 
PREFIX foaf: <http://xmlns.com/foaf/0.1/> 
PREFIX lpv: <http://purl.org/linkedpolitics/vocabulary/> 
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 

SELECT ?text (SAMPLE(?speaker) AS ?speaker1) (SAMPLE(?given) AS ?given1) (SAMPLE(?surname) AS ?surname1) (SAMPLE(?acronym) AS ?country1) (SAMPLE(?partyLabel) AS ?partyLabel1) (SAMPLE(?type) AS ?type1)
WHERE {
   <http://purl.org/linkedpolitics/eu/plenary/2010-12-16_AgendaItem_4> dcterms:hasPart ?speech.
   ?speech lpv:speaker ?speaker.
   ?speaker foaf:givenName ?given.
   ?speaker foaf:familyName ?surname.
   ?speaker lpv:countryOfRepresentation ?country.
   ?country lpv:acronym ?acronym.
   ?speech lpv:translatedText ?text.
   ?speaker lpv:politicalFunction ?func.
   ?func lpv:institution ?institution.
   ?institution rdfs:label ?partyLabel.
   ?institution rdf:type ?type.
   FILTER(langMatches(lang(?text), "en"))
} GROUP BY ?text