Я начинаю использовать библиотеку rdflib
для работы с данными rdf в Python. На данный момент я хочу создать .n3
файл некоторого rdf-графа, который выглядит так:
@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
не определил в начале файла второе пространство имен, которое я использую. Есть ли способ заставить его сделать это?
ns1
— это автоматически сгенерированное имя в сериализации; это не имеет никакого отношения к тому факту, что ваша переменная называетсяns1
(я полагаю). Вам по-прежнему нужно выполнитьgg.bind('ns2', URIRef('http://second.namespace/some/name#'))
для привязкиns2
(и вы должны сделать то же самое и для первого пространства имен). - person Joshua Taylor   schedule 13.02.2015bind
. Я посмотрю и отредактирую свой вопрос с результатами. - person 5xum   schedule 14.02.2015bind
не было бы именно тем, как заставить rdflib определить пространство имен, в чем был вопрос? - person Joshua Taylor   schedule 14.02.2015