0

我正在使用 rdfLib 以 trig 格式(基于海龟)序列化我的三元组,但由于某种原因,我的 sh:pattern 语句(正则表达式格式)中的反斜杠 () 加倍。我尝试将 sh:pattern 的值输入为原始字符串,并转义反斜杠,但它仍然在生成的 trig 文件中创建了太多反斜杠。

例子:

"shpattern": r"^\s|\d{VALUE}\D"

一旦序列化变为:

sh:pattern "^\\s|\\d{4}\\D"

在输入和最终的序列化之间有一些转换步骤,但这些转换都没有触及原始输入中的反斜杠,所以这让我责怪序列化。

有谁知道为什么 rdfLib 可能会这样做,以及是否有办法将其关闭?我可以想象 rdfLib 可能会看到一些字符串,并决定如果有任何反斜杠,我可能想转义它们(通常我想要),但由于输出实际上是反斜杠具有正则表达式的 shacl 形状的输入功能我不想逃避它们!

感谢您的任何提示!

4

1 回答 1

1

尝试使用 RDFlib 解析此 RDF 中断:

ttl = """
    PREFIX sh: <http://www.w3.org/ns/shacl#>

    <a:> sh:pattern "^\s|\d{VALUE}\D" .
    """

但这有效:

g = Graph()
g.add((
    URIRef("a:"),
    URIRef("http://www.w3.org/ns/shacl#pattern"),
    Literal("^\s|\d{VALUE}\D")
))
g2 = Graph().parse(data=g.serialize())
print(g2.serialize())

所以答案是 Turtle 解析器确实无法处理 RDF 文字中未转义的反斜杠,RDFlib 将对它们进行编码,但不会再次对其进行重新编码。因此,当您将其从 RDF 中取出到工具中时,您只需像这样对正则表达式进行 unencode。

我确信pySHACL适用于所有形式的输入。

于 2021-12-17T06:49:38.850 回答