Заставить rdflib определить пространство имен

Я начинаю использовать библиотеку 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 не определил в начале файла второе пространство имен, которое я использую. Есть ли способ заставить его сделать это?


person 5xum    schedule 13.02.2015    source источник
comment
На это отвечает RDFLib: префиксы пространства имен в XML-сериализации? ns1 — это автоматически сгенерированное имя в сериализации; это не имеет никакого отношения к тому факту, что ваша переменная называется ns1 (я полагаю). Вам по-прежнему нужно выполнить gg.bind('ns2', URIRef('http://second.namespace/some/name#')) для привязки ns2 (и вы должны сделать то же самое и для первого пространства имен).   -  person Joshua Taylor    schedule 13.02.2015
comment
Я думаю, все еще остается вопрос, для каких пространств имен rdflib пытается автоматически генерировать префиксы? Это может быть что-то столь же простое, как, возможно, только для IRI, появляющихся в позиции субъекта; кто знает.   -  person Joshua Taylor    schedule 13.02.2015
comment
@JoshuaTaylor Спасибо за предоставленную ссылку. Я не думаю, что мой ответ является точным дубликатом, но ответ может оказаться бесполезным, особенно использование команды bind. Я посмотрю и отредактирую свой вопрос с результатами.   -  person 5xum    schedule 14.02.2015
comment
Почему это будет бесполезно? Разве использование bind не было бы именно тем, как заставить rdflib определить пространство имен, в чем был вопрос?   -  person Joshua Taylor    schedule 14.02.2015
comment
@JoshuaTaylor Это была худшая опечатка. Я хотел написать полезно (честно говоря, хотел!).   -  person 5xum    schedule 14.02.2015
comment
Не волнуйтесь! Я надеюсь, что это окажется полезным. :)   -  person Joshua Taylor    schedule 16.02.2015


Ответы (1)


Метод bind - это то, что я искал. Он использовался в соответствующем вопросе и также полезен здесь.

Добавление строк

gg.bind('myprefix1', ns1)
gg.bind('myprefix2', ns1)

получается то что мне нужно.

person 5xum    schedule 24.02.2015