RDFlib 在三元组中添加空白节点

RDFlib adding blank nodes in triples

我正在使用 RDFlib 来自动执行创建 DSD 的过程。 我想得到一个格式如下:

_:refPeriodStep1 a qb4o:HierarchyStep;
etc...

但使用这个:

graph.add((BNode('refPeriodStep1'), RDF.type, URIRef(qb4o + 'HierarchyStep')))

文件未按要求创建。

我尝试使用函数 n3():

graph.add((BNode('refPeriodStep1').n3(), RDF.type, URIRef(qb4o + 'HierarchyStep')))

但出现以下错误:

AssertionError: Subject _:refPeriodStep1 must be an rdflib term

有什么办法可以得到吗?

如评论中所建议,如果空白节点的名称很重要,您应该改用 URI。 您最后的评论表明您在陈述 URIRef('_', 'refPeriodStep1') 时没有正确使用 URIRef(根据我的理解)。

如果您希望您的 refPeriodStep1 不为空节点,同时保持它(以某种方式)没有前缀,您可以使用图表的 namespace_manager 定义一个空前缀。

例如,下面的代码是使用 Namespace 函数而不是直接使用 URIRef 创建类型 qb4o:HierarchySteprefPeriodStep(如果您重复使用很多,这可能是最简单的方法您的名称空间如此处所述 in the documentation) :

from rdflib.namespace import NamespaceManager
from rdflib import BNode, Namespace, Graph

QB4O = Namespace('http://example.com/qb4o#')
n = Namespace('http://example.com/base-ns#')

g = Graph()
g.namespace_manager = NamespaceManager(Graph())
g.namespace_manager.bind('qb4o', QB4O)
g.namespace_manager.bind('', n)

g.add((n['refPeriodStep1'], RDF.type, QB4O['HierarchyStep']))

g.serialize('test.ttl', format='turtle')

这将输出以下内容(在 turtle 中),这接近于您的预期:

@prefix : <http://example.com/base-ns#> .
@prefix qb4o: <http://example.com/qb4o#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xml: <http://www.w3.org/XML/1998/namespace> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

:refPeriodStep1 a qb4o:HierarchyStep .

请注意,如果您尝试以 n-triples 格式序列化空白节点,RDFLib 将保留创建该空白节点时使用的名称,例如:

_:refPeriodStep1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.com/qb4o#HierarchyStep> .