rdfLib 将单个反斜杠转换为多个反斜杠

rdfLib turning a single backslash into multiple backslashes

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

示例:

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

序列化后变为:

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

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

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

感谢任何提示!

尝试使用 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 中取出到工具中时,您只需像那样取消编码正则表达式。

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