自定义RDFLib存储中如何调整Join顺序适配虚拟三元组?
问题背景与优化需求
我们在一个项目中重写了store的triples方法,用于根据主语/谓词或谓词/宾语对生成虚拟三元组,该逻辑必须依赖主语或宾语的真实绑定值才能正常工作。
联邦查询与代数结构
我们收到的联邦查询格式如下:
SELECT REDUCED * WHERE { ?child owl:sameAs ?child_mapped . } VALUES (?child) { (<http://purl.obolibrary.org/obo/CHEBI_1>) (<http://purl.obolibrary.org/obo/CHEBI_2>) }
对应的代数结构为:
(base <http://example/base/> (join (bgp (triple ?child <http://www.w3.org/2002/07/owl#sameAs> ?child_mapped)) (table (vars ?child) (row [?child <http://purl.obolibrary.org/obo/CHEBI_1>]) (row [?child <http://purl.obolibrary.org/obo/CHEBI_2>]) )))
期望的代数结构
由于三元组是虚拟的,必须将VALUES对应的table放在Join的左侧才能正常工作,这样triples方法执行时能获取到主语的绑定值,进而实例化虚拟三元组。期望的代数结构如下:
(base <http://example/base/> (join (table (vars ?child) (row [?child <http://purl.obolibrary.org/obo/CHEBI_1>]) (row [?child <http://purl.obolibrary.org/obo/CHEBI_2>]) ) (bgp (triple ?child <http://www.w3.org/2002/07/owl#sameAs> ?child_mapped))))
优化器注入位置咨询
我们需要注入一个优化器,确保VALUES对应的table始终位于Join的左侧。此前直接修改algebra.py中交换join左右节点的方式不可维护,修改_buildQueryStringForServiceCal内联VALUES的方式也不合适。
我们希望将此作为一个标准化的优化步骤,请问应该在何处注入该优化器?是扩展SPARQLProcessor在评估前添加步骤,还是有更合适的位置?
内容的提问来源于stack exchange,提问作者Jerven
相关产品推荐
相关产品推荐

