强制 rdflib 定义命名空间
Force rdflib to define a namespace
我开始使用 rdflib
库来处理 Python 中的 rdf 数据。目前,我想创建一些 rdf 图的 .n3
文件,如下所示:
@prefix ns1: <http://some.namespace/with/name#> .
@prefix ns2: <http://second.namespace/some/name#>
@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#> .
<my_example> ns1:annotated_with [ ns1:annotation
ns2: annotation_value> ] ;
ns1:name "myname" .
也就是说,这个图中有一个例子叫做my_example
,它的名字是"myname"。此示例使用注释值为 annotation value
的对象进行注释。我想在 Python 中构建这个示例,如下所示:
import rdflib
gg=rdflib.graph.Graph()
ns1 = rdflib.Namespace('http://some.namespace/with/name#')
ns2 = rdflib.Namespace('http://second.namespace/some/name#')
u = rdflib.term.URIRef('my_example')
gg.add((u, ns1.name, rdflib.Literal('myname')))
blank = rdflib.BNode()
gg.add((u, ns1.annotated_with, blank))
gg.add((blank, ns1.annotation, ns2.annotation_value))
print gg.serialize(format='n3')
在我看来,这应该会产生正确的结果,并且在某种程度上确实如此。上面代码的结果是一个 n3
字符串,如下所示:
@prefix ns1: <http://some.namespace/with/name#> .
@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#> .
<my_example> ns1:annotated_with [ ns1:annotation <http://second.namespace/some/name#annotation_value> ] ;
ns1:name "myname" .
这很接近,但我不明白为什么 rdflib
没有在文件的开头定义我正在使用的第二个命名空间。有没有办法强制它这样做?
bind
方法正是我要找的。它在相关问题中使用过,在这里也很有用。
添加行
gg.bind('myprefix1', ns1)
gg.bind('myprefix2', ns1)
我需要的结果。
我开始使用 rdflib
库来处理 Python 中的 rdf 数据。目前,我想创建一些 rdf 图的 .n3
文件,如下所示:
@prefix ns1: <http://some.namespace/with/name#> .
@prefix ns2: <http://second.namespace/some/name#>
@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#> .
<my_example> ns1:annotated_with [ ns1:annotation
ns2: annotation_value> ] ;
ns1:name "myname" .
也就是说,这个图中有一个例子叫做my_example
,它的名字是"myname"。此示例使用注释值为 annotation value
的对象进行注释。我想在 Python 中构建这个示例,如下所示:
import rdflib
gg=rdflib.graph.Graph()
ns1 = rdflib.Namespace('http://some.namespace/with/name#')
ns2 = rdflib.Namespace('http://second.namespace/some/name#')
u = rdflib.term.URIRef('my_example')
gg.add((u, ns1.name, rdflib.Literal('myname')))
blank = rdflib.BNode()
gg.add((u, ns1.annotated_with, blank))
gg.add((blank, ns1.annotation, ns2.annotation_value))
print gg.serialize(format='n3')
在我看来,这应该会产生正确的结果,并且在某种程度上确实如此。上面代码的结果是一个 n3
字符串,如下所示:
@prefix ns1: <http://some.namespace/with/name#> .
@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#> .
<my_example> ns1:annotated_with [ ns1:annotation <http://second.namespace/some/name#annotation_value> ] ;
ns1:name "myname" .
这很接近,但我不明白为什么 rdflib
没有在文件的开头定义我正在使用的第二个命名空间。有没有办法强制它这样做?
bind
方法正是我要找的。它在相关问题中使用过,在这里也很有用。
添加行
gg.bind('myprefix1', ns1)
gg.bind('myprefix2', ns1)
我需要的结果。