如何在rdflib中获取图形的命名空间

时间:2018-04-19 17:52:52

标签: python rdflib

我使用rdflib:

在Python中加载了一个RDF文件
g = rdflib.Graph()
g.parse ( "foaf_ex.rdf" )

*.rdf定义了许多前缀/命名空间对(例如foaf:),我知道它们会进入g,因为当我打印{{1}时它们仍然存在}。

我的问题是,是否有一种简单的方法可以从g.serialize()解决"foaf:Person",即变成g?从最初的前缀URI中直接获得"http://xmlns.com/foaf/0.1/Person"会更好,但是如果我至少可以得到完整的URI字符串,那将无济于事。

2 个答案:

答案 0 :(得分:0)

方法 namespaces() 返回一个生成器,因此:

ns_prefix = 'foaf'
for ns_prefix, namespace in g.namespaces():
    if prefix == ns_prefix:
        print(namespace)

namespace 变量包含一个 URIRef 对象。

答案 1 :(得分:0)

回答这个老问题,同时积累经验。

rdflib 有一个 NamespaceManager 类,Graph 对象有一个 namespace_manager 属性,可以传递给一个 from_n3() 函数,后者做我需要的:

def from_n3(s, default=None, backend=None, nsm=None):
    r'''
    Creates the Identifier corresponding to the given n3 string.

        >>> from_n3('<http://ex.com/foo>') == URIRef('http://ex.com/foo')
        True
        >>> from_n3('"foo"@de') == Literal('foo', lang='de')
        True
        >>> from_n3('"""multi\nline\nstring"""@en') == Literal(
        ...     'multi\nline\nstring', lang='en')
        True
        >>> from_n3('42') == Literal(42)
        True
        >>> from_n3(Literal(42).n3()) == Literal(42)
        True
        >>> from_n3('"42"^^xsd:integer') == Literal(42)
        True
        >>> from rdflib import RDFS
        >>> from_n3('rdfs:label') == RDFS['label']
        True
        >>> nsm = NamespaceManager(Graph())
        >>> nsm.bind('dbpedia', 'http://dbpedia.org/resource/')
        >>> berlin = URIRef('http://dbpedia.org/resource/Berlin')
        >>> from_n3('dbpedia:Berlin', nsm=nsm) == berlin
        True

    '''

我开发了 NamespaceManager 的扩展版本,XNamespaceManager,它使访问此功能和其他功能变得简单。