我肯定这里缺少一些基本的东西。使用rdflib解析rdf图,可以得到一个使用namespaces()
方法的图对象。这返回一个带有前缀的元组列表,这些前缀绑定到命名空间URIRef
s:
[('xml', rdflib.term.URIRef('http://www.w3.org/XML/1998/namespace'))
('foo', rdflib.term.URIRef('http://example.org/scheme#'))
]
我希望这些前缀中的每一个都可以作为变量用于我的代码。我可以通过这样做明确地为每一个做到这一点:
foo = rdflib.Namespace(rdflib.term.URIRef('http://example.org/scheme#'))
这样我就可以做这样的事情:
g.subject_objects(foo.bar)
但是,有没有一种蟒蛇般的方法来获取这样一个元组列表,并为每个项分配第一个元素字符串作为第二个元素的变量?
虽然使用exec
在技术上是可行的,但我强烈建议使用不同的方法,例如使用字典。
namespaces = dict([
('xml', rdflib.term.URIRef('http://www.w3.org/XML/1998/namespace')),
('foo', rdflib.term.URIRef('http://example.org/scheme#')),
])
...
g.subject_objects(namespaces['foo'].bar)
为了回答最初的问题,如果你绝对必须有动态的个体变量,那么你可以这样做:
for variable, value in [('xml', rdflib...), ('foo', rdflib...)]:
exec(f"{variable} = {value}")
...
g.subject_objects(foo.bar)
这将创建一堆你不知道的变量,还可能覆盖其他你不期望的变量。
为了记录这篇文章,以防将来有人访问:请记住,RDFlib附带了一大堆已经加载的命名空间:
from rdflib.namespace import BRICK, CSVW, DC, DCAT, DCMITYPE, DCTERMS, DOAP, FOAF, ODRL2, ORG, OWL, PROF, PROV, QB, RDF, RDFS, SDO, SH, SKOS, SOSA, SSN, TIME, VANN, VOID, XMLNS, XSD
我倾向于这样声明我自己的名称空间:
from rdflib.namespace import RDFS, XSD
EG = Namespace("http://example.com/")
然后只使用EG,就像我使用其他的一样,所以<http://example.com/thing>
就是EG.thing
。
这并不能直接解决问题,但很有用。
此外,无需:
foo = rdflib.Namespace(rdflib.term.URIRef('http://example.org/scheme#'))
这样就可以了:
from rdflib import Namespace
foo = Namespace("http://example.org/scheme#")