我的查询:
select ?x ?z
where
{
?x <http://purl.uniprot.org/core/name> ?y .
?x <http://purl.uniprot.org/core/volume> ?z .
?x <http://purl.uniprot.org/core/pages> "176-186" .
}
我需要为此查询创建自定义解析器。
当我在jena模型上执行此查询时,它返回一条记录。 任何人都可以解释这个查询实现吗?
我将此查询分为三个部分:
select ?x ?y where { ?x <http://purl.uniprot.org/core/name> ?y . }
Total Records Found : 3034
select ?x ?z where { ?x <http://purl.uniprot.org/core/name> ?y . ?x <http://purl.uniprot.org/core/volume> ?z . }
Total Records Found : 2679
select ?x ?z where { ?x <http://purl.uniprot.org/core/name> ?y . ?x <http://purl.uniprot.org/core/volume> ?z . ?x <http://purl.uniprot.org/core/pages> "176-186" . }
Total Records Found : 1
请帮我制作自定义查询解析器。
答案 0 :(得分:2)
您正在尝试计算三种三重模式的连接。关于通过Apache Hadoop加入实现的论文将是有用的背景。
查看Apache Spark和弹性分布式数据集(RDD)概念可能会有所帮助。
考虑每种模式的可能选择性也很重要 - 正如约书亚所说,“页面”模式可能会产生一种独特的解决方案,并使用它来简单地查找每个“名称”和“数量”并不是一个苛刻的要求任务。
ARQ的内存中算法并非旨在实现您在Hadoop上所需的最大独立并行性。合并连接(或排序合并连接)对数据进行两次可并行访问。
您可以通过扩展类OpExecutor
在基本模式级别或整个代数执行级别或其间的任何点扩展ARQ。
答案 1 :(得分:1)
听起来你在问为什么
select ?x ?z where {
?x <http://purl.uniprot.org/core/name> ?y . # (a)
?x <http://purl.uniprot.org/core/volume> ?z . # (b)
?x <http://purl.uniprot.org/core/pages> "176-186" . # (c)
}
只返回一个结果,而每行只返回更多。 SPARQL中的三重模式是结合的:非可选模式必须与数据匹配才能返回结果。因此,您要求?x
和?z
的值保持以下 ALL :
?x
的名称为?y
, AND ?x
有一些卷的值, AND ?x
的页面具有特定值“176-186”。根据属性的名称,听起来好像是在查询一些书目信息。毫不奇怪,在给定的书目数据库中,可能只有一篇文章的页面正好是“176-186”,因为这是一个非常具体的值。
答案 2 :(得分:0)
已修改为包含正确的代数链接
我可以提供的最佳建议是查看Jena documentation for ARQ's SPARQL Algebra并在该级别推导您的自定义评估引擎。另一个可能提供信息的参考文献是W3 SPARQL Algebra。
似乎(来自您选择的标签)您打算执行分布在map-reduce作业中的查询操作,并且您正在查看代数应用程序的特定示例作为概念验证。如果您的目的是将其集成到Jena的查询评估中,那么您需要手动浏览Jena的现有系统,以便了解它的行为方式。