更改自定义 RDFLib 存储中的连接顺序

问题描述 投票:0回答:0

一个项目中,我们覆盖存储三元组方法以生成给定主语/谓语或谓语/宾语对的虚拟三元组。逻辑取决于主体或客体被绑定到一个真正的价值来工作。

我们正在接收以下形式的联合查询。

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>])
    )))

由于我们的三元组是虚拟的,我们需要从连接左侧的值中获取绑定变量才能工作,即

(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 tables

我们在第 707 行更改了 algebra.py 以提供所需的连接顺序(反转 p1 和 p2)。但这不是可维护的解决方案,也不会将 _buildQueryStringForServiceCal

 更改为具有内联 VALUES 子句而不是在末尾。

我们应该将其作为一种优化器步骤。我们是否应该引入我们自己的 SPARQLProcessor 扩展,我们将其添加为

评估 之前的一个步骤,还是其他地方是更好的解决方案?

sparql rdflib
© www.soinside.com 2019 - 2024. All rights reserved.