python - #rdflib (python):如何从字符串中获取 URIRef,例如 'ns:xxx'?
问题描述
我有一个 RDFlib 图 g,它的 NameSpaceManager 知道一些命名空间。
如何从诸如“ns:xxx”之类的字符串中获取 URIRef,其中 ns 是与已知的命名空间相关联的前缀g.namespace_manager
?基本上,我正在寻找一种与 URIRef 的 n3(g.namespace_manager) 进行逆运算的方法。我非常有信心有办法做到这一点,因为解析海龟文件或 sparql 查询需要类似的函数,但我找不到它。否则,当然,编写它一定不是很难。
TIA
解决方案
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
推荐阅读
- pandas - 过滤每个 ID 的特定变量中具有相同值的行 - Pandas
- java - 这段代码有什么问题?(多数据源 Oracle)
- java - Java中的显示列表
- web-crawler - 什么是“Bytespider”用户代理?
- curl - 相当于 cURL 的请求返回错误
- visual-studio - UWP - SignTool 错误:未找到符合所有给定条件的证书
- android - FusedLocationProviderClient 和唤醒锁
- python - 如何使用 fbs 在 pyqt5 应用程序中包含 exe
- clojure - 使用 Datomic 的 Compojure 无法编译
- c++ - 子类中的编辑功能