由于我是语义技术的新手,请耐心等待。
我正在尝试使用 rdflib
来从本体的类中提取标签。然而有些本体并不包含标签本身,而是有其他本体的类的URI。如何从外部本体的URI中提取标签呢?
我的尝试背后的直觉集中在识别本地不包含标签的类(如果这是正确的说法的话),然后 "跟踪 "它们的URI到外部本体来提取标签。然而我实现的方式并不奏效。
import rdflib
g = rdflib.Graph()
# I have no trouble extracting labels from this ontology:
# g.load("http://purl.obolibrary.org/obo/po.owl#")
# However, this ontology contains no labels locally:
g.load("http://www.bioassayontology.org/bao/bao_complete.owl#")
owlClass = rdflib.namespace.OWL.Class
rdfType = rdflib.namespace.RDF.type
for s in g.subjects(predicate=rdfType, object=owlClass):
# Where label is present...
if g.label(s) != '':
# Do something with label...
print(g.label(s))
# This is what I have added to try to follow the URI to the external ontology.
elif g.label(s) == '':
g2 = rdflib.Graph()
g2.parse(location=s)
# Do something with label...
print(g.label(s))
我是否采取了完全错误的方法?感谢所有的帮助! 谢谢您的帮助。
我认为你可以比这更有效。你试图做一个网络请求,远程本体下载和搜索。每次 中没有给定标签的URI。http://www.bioassayontology.org/bao/bao_complete.owl
这是其中的大部分,而且是一个非常大的数字。所以,你的脚本会花很长时间,并且会让交付这些远程本体的web服务器崩溃。
看一下 http://www.bioassayontology.org/bao/bao_complete.owl
我看到那里大多数没有标签的URI都来自OBO,也许还有一些其他的本体,但大多数是OBO。
你应该做的是下载一次OBO,然后用RDFlib加载它。然后,如果你在加入(联合)图上运行上面的脚本,就会发现 http://www.bioassayontology.org/bao/bao_complete.owl
&OBO,你将拥有OBO所有的内容,让你的指尖上。g.label(s)
会发现标签的比例更高。
也许还有其他几个源头本体提供标签,为 http://www.bioassayontology.org/bao/bao_complete.owl
你可能也需要,但我快速浏览后发现只有OBO。