Rdf SPARQL查询中可选关键字的替代方案?

Rdf SPARQL查询中可选关键字的替代方案?,rdf,sparql,virtuoso,Rdf,Sparql,Virtuoso,我有一个sparql查询,它要求给定类型的URI的某些属性。由于我不确定这些属性是否存在,我使用可选关键字: PREFIX mbo: <http://creativeartefact.org/ontology/> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> SELECT * WHERE { ?uri a mbo:LiveMusicEvent. OPTIONAL {?uri rdfs:label

我有一个sparql查询,它要求给定类型的URI的某些属性。由于我不确定这些属性是否存在,我使用可选关键字:

PREFIX mbo: <http://creativeartefact.org/ontology/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
SELECT * WHERE {
  ?uri a mbo:LiveMusicEvent. 
    OPTIONAL {?uri rdfs:label ?label}. 
    OPTIONAL {?uri mbo:organisedBy ?organiser}. 
    OPTIONAL {?uri mbo:takesPlaceAt ?venue}. 
    OPTIONAL {?uri mbo:begin ?begin}. 
    OPTIONAL {?uri mbo:end ?end}. 
}
前缀mbo:
前缀rdfs:
选择*WHERE{
?uri a mbo:LiveMusicEvent。
可选的{?uri rdfs:label?label}。
可选{?uri mbo:OrganizedBy?Organizer}。
可选{uri mbo:takesPlaceAt?地点}。
可选{?uri mbo:begin?begin}。
可选的{uri mbo:end?end}。
}
当我对我的SPARQL端点(Virtuoso服务器)运行此查询时,我得到了错误:

Virtuoso 42000错误估计执行时间-721420288(秒) 超过400(秒)的限制

当我减少可选子句时,在第一个删除的子句之后,估计执行时间为4106秒,当我删除两个子句时,执行查询(并立即返回值)


我看不出,为什么使用额外的可选子句时估计的执行时间会像这样飞涨,但也许我只是使用了一个错误的构造查询?

对于SPARQL引擎来说,可选模式的评估成本通常很高(与“普通”连接模式相比)。在本例中,错误表明Virtuoso的查询计划器估计查询过于复杂,无法在设定的时间限制内执行(请注意,它估计了这一点,因此精确的值可能是错误的)

你有几种选择。不过,大多数查询都涉及到不止一个查询。一个常见的模式是“检索并迭代”模式-首先执行一个查询,检索所有的
mbo:LiveMusicEvent

 SELECT ?uri WHERE { ?uri a mbo:LiveMusicEvent } 
然后迭代结果并检索每个实例的可选属性:

SELECT * 
WHERE { VALUES(?uri) { <http://example.org/instance1> } 
        OPTIONAL {?uri rdfs:label ?label}. 
        OPTIONAL {?uri mbo:organisedBy ?organiser}. 
        OPTIONAL {?uri mbo:takesPlaceAt ?venue}. 
        OPTIONAL {?uri mbo:begin ?begin}. 
        OPTIONAL {?uri mbo:end ?end}. 
}

将以RDF图的形式检索有关
LiveMusicEvent
实例的所有数据。将该图放入本地RDF模型中(例如,如果您使用Java,则放入Sesame模型或内存存储库),并从那里进一步查询它

我非常喜欢的一件事(但不知道它会有多贵)是从[construct{…}where{…}]选择执行
之类的操作的能力。。。其中{…}
。这会使一些困难的任务变得非常容易。@JoshuaTaylor我一直觉得有点奇怪,
构造(在某种程度上,它是RDF更“自然”的查询类型)不容易与其他查询组合/链接。我们有子选择-为什么没有子构造?我认为这是工作组刚推出的功能之一“可能很好,但不是现在”。是的,将来拥有它会很好,我们实际上在YarcData内部实现了
构造
子查询,但不在
FROM
子句中。我们使用它们作为调用更传统的图形分析(例如k-means、最短路径等)的一种方式,将它们用作子查询,并应用自定义修饰符,以便可以合理地嵌套回常规图形中pattern@RobV这真是太令人兴奋了。你最终是否不得不对可以构建的东西施加任何限制?实现是否在构造查询中构造查询?(一旦你有了它,你就可以了。)虽然子查询是首先在概念上进行评估的,但是有没有什么优化方法不首先完全评估构造,而是将其用作“另一种搜索方式”?哇,我没想到会有那么难。。。谢谢你给我点启示!我只是在想最好的方法是什么。也许将CONSTRUCT子句变成SELECT子句,然后遍历结果集,选择所需的属性?这样的解决方案有什么不足之处吗?(记录在案:我使用的是RobVs dotNetRdf)
 CONSTRUCT 
 WHERE { 
    ?uri a mbo:LiveMusicEvent; 
         ?p ?o . 
 }