1

我正在使用 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

有什么办法可以随心所欲吗?

4

1 回答 1

3

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

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

例如,以下代码使用fonctionnalities 而不是 URIRef 直接创建refPeriodStep类型(如果您重用大量命名空间,如文档中所述,这可能是最简单的方法):qb4o:HierarchyStepNamespace

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')

这将输出以下(在海龟中)与您期望的接近:

@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> .
于 2020-07-22T18:25:55.290 回答