设置运算符,"in" 运算符,BNodes?

Set Operators, "in" operator, BNodes?

我试图理解 RDFlib 中的集合运算(联合、加法、交集、差分、异或)的逻辑,并且用相同的文件做了一些测试,结果与我幼稚的期望不符。因此,我用两种方式测试了“in”运算符:

我遍历图 A 中的所有项目并检查它们是否存在于图 B 中,在从一个很小的 ​​RDF/Turtle 测试文件初始化 A 并初始化 B 之后:

  1. 通过设置 B=A
    A = Graph()
    A.parse("A.ttl", format='turtle')
    B=A
    
    for t in A.triples((None, None, None)):
        if t in B:
            print(f"found {t} in B")
        else:
            print(f"didn't find {t} in B")
  1. 通过从同一文件加载它
    A = Graph()
    A.parse("A.ttl", format='turtle')
    B = Graph()
    B.parse("A.ttl", format='turtle')
    
    for t in A.triples((None, None, None)):
        if t in B:
            print(f"found {t} in B")
        else:
            print(f"didn't find {t} in B")

在情况 1) 中,A 中的所有三元组也在 B 中找到 -- 正如预期的那样 在情况2)中,只有A中的部分三元组在B中也被发现。(那些没有BNodes的)

有什么办法可以避免情况 2 的行为)。还是我误解了一些非常基本的东西? (我是RDF新手,但不怕图表)

干杯 乔尔

空白节点在图外没有身份。如果您两次处理具有空白节点的同一个文件,您应该期望空白节点获得不同的内部标识符。

供参考,section 3.5 of the RDF 1.1 Concepts and Abstract Syntax说明:

Blank nodes do not have identifiers in the RDF abstract syntax. The blank node identifiers introduced by some concrete syntaxes have only local scope and are purely an artifact of the serialization.

In situations where stronger identification is needed, systems MAY systematically replace some or all of the blank nodes in an RDF graph with IRIs. Systems wishing to do this SHOULD mint a new, globally unique IRI (a Skolem IRI) for each blank node so replaced.

因此,要解决此问题,您可以为空白节点提供一个 IRI,该 IRI 在使用内存中的图形之外仍然存在。参考部分提供了有关如何创建此类 IRI 的指南。