首页 > 解决方案 > #rdflib (python):如何从字符串中获取 URIRef,例如 'ns:xxx'?

问题描述

我有一个 RDFlib 图 g,它的 NameSpaceManager 知道一些命名空间。

如何从诸如“ns:xxx”之类的字符串中获取 URIRef,其中 ns 是与已知的命名空间相关联的前缀g.namespace_manager?基本上,我正在寻找一种与 URIRef 的 n3(g.namespace_manager) 进行逆运算的方法。我非常有信心有办法做到这一点,因为解析海龟文件或 sparql 查询需要类似的函数,但我找不到它。否则,当然,编写它一定不是很难。

TIA

标签: pythonrdflib

解决方案


from rdflib import Graph, Namespace
from rdflib.namespace import RDF

g = Graph()
NS = Namespace("http://example.com/")

# then, say Xxx is a class and Aaa is an instance of Xxx...
g.add((NS.Aaa, RDF.type, NS.Xxx))

# so use NS.Xxx (or NS["Xxx"]) to get a URIRef of NS.Xxx from Namespace NS
print(type(NS))     # --> <class 'rdflib.term.URIRef'>
print(type(NS.Xxx)) # --> <class 'rdflib.term.URIRef'>
print(NS.Xxx)       # --> "http://example.com/Xxx"

如果要在图形中绑定前缀,请使用 rdflibGraph类的bind()方法,因此,对于上面的代码,您将使用:

g.bind("ns", NS)

现在,如果使用了解前缀的格式(如 Turtle)序列化该图,则将使用“ns”。上述数据将是:

@prefix ns: <http://example.com/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .

ns:Aaa rdf:type ns:Xxx .

所以,在 Python 中,如果你想从字符串 "ns:Xxx" 中创建 URI "http://example.com/Xxx"" 你应该拥有你需要的一切:

  • 命名空间声明:NS = Namespace("http://example.com/")
  • 前缀/命名空间绑定g.bind("ns", NS)

另一方面,IFF,您没有自己声明命名空间,但它在图中,并且您只有短格式 URI“ns:Xxx”,您可以这样做以列出图中使用的所有绑定前缀和命名空间:

for n in g.namespace_manager.namespaces():
    print(n)

返回,对于上面的数据:

('xml', rdflib.term.URIRef('http://www.w3.org/XML/1998/namespace'))
('rdf', rdflib.term.URIRef('http://www.w3.org/1999/02/22-rdf-syntax-ns#'))
('rdfs', rdflib.term.URIRef('http://www.w3.org/2000/01/rdf-schema#'))
('xsd', rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#'))
('eg', rdflib.term.URIRef('http://example.com/'))

所以,如果你知道 "eg:Xxx",你可以把 "eg" 部分分开,然后像这样创建你想要的 URI:

print(
    [str(x[1]) for x in g.namespace_manager.namespaces() if x[0] == s.split(":")[0]]
    [0] + s.split(":")[1]
)

印刷:

http://example.com/Xxx

推荐阅读