我使用的是TopBraid Composer Free Edition (TBC FE) Version 5.1.3。我正在构建SPIN规则/CONSTRUCT查询。我的部分查询具有多个OR条件的FILTER语句。我将其输入TBC FE如下:
FILTER (
(?orgString = SUBSTR("AF X"^^xsd:string, 1, 4)) ||
(?orgString = SUBSTR("J X"^^xsd:string, 1, 4)) ||
(?orgString = SUBSTR("AR X"^^xsd:string, 1, 4)) ||
(?orgString = SUBSTR("N X"^^xsd:string, 1, 4)) ||
(?orgString = SUBSTR("NS X"^^xsd:string, 1, 4)) ||
(?orgString = SUBSTR("MC X"^^xsd:string, 1, 4))
) .
但是,当我在TBC FE中保存SPIN规则时,它将OR条件重新分组为一组二进制OR:
FILTER (
(((((?orgString = SUBSTR("AF X"^^xsd:string, 1, 4)) ||
(?orgString = SUBSTR("J X"^^xsd:string, 1, 4))) ||
(?orgString = SUBSTR("AR X"^^xsd:string, 1, 4))) ||
(?orgString = SUBSTR("N X"^^xsd:string, 1, 4))) ||
(?orgString = SUBSTR("NS X"^^xsd:string, 1, 4))) ||
(?orgString = SUBSTR("MC X"^^xsd:string, 1, 4))
) .
我的问题是:为什么要重组?我使用过其他SPARQL编辑器和端点,它们没有进行这种重新分组。我认为这使我的代码更难阅读(成本),所以我想知道这样做的好处是什么?
另外,如果这是重新分组是不必要的,有没有办法关闭它在TBC FE?
谢谢。
PS:是的,我知道取字面值字符串的子字符串看起来很愚蠢。我这样做是为了避免芝麻中的一个bug,当我将从TBD FE保存的RDF文件加载到芝麻中时,这个bug会修改我的文字字符串。这个bug已经被报告并正在解决。当它修复后,我将升级我的Sesame版本并删除这些丑陋的子字符串。
这是Jena打印查询的方式,而不是TBC FE的一个方面。对于左关联的二进制操作符,解析器创建表达式树((E1 op E2) op E3),并像这样打印。它简单安全;打印表达式不考虑优先级。
另一种书写FILTER
的方法是
?orgString IN ( SUBSTR("AF X", 1, 4), SUBSTR("J X", 1, 4), ...)
如果有什么帮助的话