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:HierarchyStep
的 refPeriodStep
(如果您重复使用很多,这可能是最简单的方法您的名称空间如此处所述 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> .
我正在使用 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:HierarchyStep
的 refPeriodStep
(如果您重复使用很多,这可能是最简单的方法您的名称空间如此处所述 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> .