我试图理解RDFlib中的Set操作逻辑(Union、Addition、Inter交、Difference、Xor),并用相同的文件进行了一些测试,这些测试的结果不符合我天真的期望。因此,我用两种方法测试了"in“操作符:
在从一个很小的RDF/Turtle测试文件初始化A并初始化B之后,我遍历了图A中的所有项并检查它们是否存在于图B中:
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") 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新手,但在其他方面不害怕图形)
欢呼声乔尔
发布于 2021-06-25 21:31:10
空白节点在图形之外没有标识。如果使用空节点处理同一文件两次,则应期望空白节点获得不同的内部标识符。
作为参考,RDF 1.1概念和抽象语法第3.5节解释道:
在RDF抽象语法中,空白节点没有标识符。由某些具体语法引入的空白节点标识符仅具有本地范围,并且纯粹是序列化的工件。在需要更强标识的情况下,系统可以系统地用IRIs替换RDF图中的部分或所有空白节点。希望这样做的系统应该为每个被替换的空白节点创建一个新的、全局唯一的IRI (一个Skolem IRI)。
因此,要解决这个问题,您可以给空白节点一个IRI,这个IRI在处理内存中的图形之后仍然存在。参考部分有关于如何创建这样的IRIs的指导。
https://stackoverflow.com/questions/67976032
复制相似问题