设置运算符,“in”运算符,B节点?

2024-06-10 03:38:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图理解RDFlib中集合操作(并集、加法、交集、差分、异或)的逻辑,并使用相同的文件进行了一些测试,结果与我天真的期望不符。因此,我用两种方法测试了“in”操作符:

在从一个小小的RDF/Turtle测试文件初始化A并初始化B之后,我遍历了图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)中,在B中也只发现了A中的部分三联体(没有B节点的)

有没有办法避免案例2的行为。。还是我误解了一些非常基本的东西?(我是RDF新手,但在其他方面并不害怕图形)

干杯 乔尔


Tags: 文件innoneformatforifparserdf
1条回答
网友
1楼 · 发布于 2024-06-10 03:38:56

空白节点在图形外没有标识。如果使用空白节点处理同一个文件两次,则应该预期空白节点会获得不同的内部标识符

作为参考,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在处理内存中的图形之后仍然存在。参考部分提供了有关如何铸造此类IRIs的指南

相关问题 更多 >