使用带有CONSTRUCT的LIMIT的意外结果

时间:2013-08-23 22:18:17

标签: sparql

使用CONSTRUCT在此LIMIT查询中发生了一些奇怪的事情。我希望分别获得LIMIT 1LIMIT 2的1或2个解决方案,即一个或两个图表,但我总是得到两个图表,其中包含11或12个三元组。

CONSTRUCT { 
  ex:sceneResource skos:related ?newSceneSubject.
  ?newSceneSubject a lcx:Scene ;
                   dcterms:subject ?type ; 
                   lcx:hasTitle ?title ;
                   lcx:describedBy ?thumbNail ;
                   lcx:motto ?motto ;
                   lcx:freebaseID ?freebaseID
}
WHERE { 
  { ?newSceneSubject a ex:interestType1 }
  UNION
  { ?newSceneSubject a ex:interestType2 } 
  ?newSceneSubject lcx:hasTitle ?title ;
                   a ?type .
                   lcx:freebaseID ?freebaseID .
  OPTIONAL { ?newSceneSubject lcx:motto ?motto  }
  OPTIONAL { ?newSceneSubject lcx:describedBy ?thumbNail }
}
LIMIT 2

我是否误解LIMIT CONSTRUCT,或者Jena API中是否有错误?

1 个答案:

答案 0 :(得分:5)

您的问题有点不清楚您的期望和实际情况,但无论如何我都会尝试回答。

LIMIT适用于查询的WHERE部分,在specification中有LIMITCONSTRUCT一起使用的示例,并说明以下内容:

  

CONSTRUCT模板的输出图只由两个构成   图模式匹配的解决方案

即。它最多需要 两行WHERE子句并将其提供给CONSTRUCT模板。

由于模板可能会生成许多三元组,因此实际的最大结果数是限制乘以模板中三重模式的数量。由于模板中的单个模式可能会生成无效的三元组(并且根据specification丢弃这些模式),因此您获得的实际三元组数可能会更低:

  

如果任何此类实例化生成包含未绑定的三元组   变量或非法的RDF结构,例如主语或文字中的文字   谓词位置,然后该三元组不包括在输出RDF中   图

因此,根据您的描述和规范,Jena的行为是完全正确的。