英文:
Add new Individuals to an existing ontology from a dataframe using owlready 2
问题
我有以下的dataframe
:
import pandas as pd
data = [['onto.modify', 'onto.ModificationAction1']]
df = pd.DataFrame(data, columns=['queries', 'corpus'])
queries corpus
0 onto.modify onto.ModificationAction1
corpus
列的元素是一个名为ontology2
的本体中某个特定Class
的Individuals
。
我想将queries
列的元素作为Individuals
添加到与corpus
列的元素所属的相同Class
中。
例如,如果onto.ModificationAction1
属于ontology2.Thing
类,那么ontology2.modify
也应该属于该类。
最初,我循环遍历corpus
列以找出每个Individual
所属的Class
:
for element in df["corpus"]:
print(element.is_a)
然而,我得到了以下错误信息:
AttributeError: 'str' object has no attribute 'is_a'
那么,我该如何解决这个错误,并最终执行上述示例中描述的操作呢?
英文:
I have the following dataframe
:
import pandas as pd
data = [['onto.modify', 'onto.ModificationAction1']]
df = pd.DataFrame(data, columns=['queries', 'corpus'])
queries corpus
0 onto.modify onto.ModificationAction1
The elements of corpus column
are Individuals
of a particular Class
of an ontology
called ontology2
.
I want to add the elements of the queries column
as individuals
to the same Class
that the elements of the corpus column
belong to.
For example, if the onto.ModificationAction1
belong to the ontology2.Thing class
the same must be for the ontology2.modify
.
Initially, I loop over the corpus columns
to find in which Class
each Individual
belongs to:
for elements in df["corpus"]:
print (element.is_a)
However, I get back:
> AttributeError: 'str' object has no attribute 'is_a'
So how do I solve this error and eventually perform what I am describing above in the example?
答案1
得分: 2
错误发生是因为您的数据框中的值是字符串,而不是个体。您需要使用search()
或search_one()
根据名称查找个体(请参阅文档)。以下代码可以完成这个任务:
import pandas as pd
import owlready2
data = [['onto.modify', 'onto.ModificationAction1']]
df = pd.DataFrame(data, columns=['queries', 'corpus'])
onto = owlready2.get_ontology("http://test.org/onto.owl")
class Action(owlready2.Thing):
namespace = onto
modification_action = Action(name="ModificationAction1")
for row in df.iterrows():
row_series = row[1]
# 丢弃本体名称,只获取个体名称
corpus_individual_name = row_series['corpus'].split('.', 1)[1]
# 查找个体
corpus_individual = onto.search_one(iri=onto.base_iri + corpus_individual_name)
# 获取个体的类
corpus_classes = corpus_individual.is_a
# 丢弃本体名称,只获取个体名称
query_individual_name = row_series['queries'].split('.', 1)[1]
# 使用旧个体的第一个类创建新个体
new_individual = corpus_classes[0](name=query_individual_name)
# 如果旧个体是多类的,将剩余的类添加到新个体中
for corpus_class in corpus_classes[1:]:
new_individual.is_a.append(corpus_class)
for i in onto.individuals():
print(i, i.is_a)
您可以在输出中看到新的个体以及它的类。
onto.ModificationAction1 [onto.Action]
onto.modify [onto.Action]
附注:我在这里假设您只有一个本体--onto
。如果不是这样,您应该要么1)有一个本体的查找字典,将"onto"
映射到实际的本体对象/IRI,要么2)在您的数据框中指定完整的IRI,并通过IRI查找本体。
英文:
Error happens because values in your dataframe are strings, not individuals. You have to look up an individual based on its name using search()
or search_one()
(see documentation). This code should do the job:
import pandas as pd
import owlready2
data = [['onto.modify', 'onto.ModificationAction1']]
df = pd.DataFrame(data, columns=['queries', 'corpus'])
onto = owlready2.get_ontology("http://test.org/onto.owl")
class Action(owlready2.Thing):
namespace = onto
modification_action = Action(name="ModificationAction1")
for row in df.iterrows():
row_series = row[1]
# Trow away ontology name, get only individual name
corpus_individual_name = row_series['corpus'].split('.', 1)[1]
# Find individual
corpus_individual = onto.search_one(iri=onto.base_iri + corpus_individual_name)
# Get individual classes
corpus_classes = corpus_individual.is_a
# Trow away ontology name, get only individual name
query_individual_name = row_series['queries'].split('.', 1)[1]
# Create new individual with first class of old individual
new_individual = corpus_classes[0](name=query_individual_name)
# In case old individual is multiclass, add remaining classes to new individual
for corpus_class in corpus_classes[1:]:
new_individual.is_a.append(corpus_class)
for i in onto.individuals():
print(i, i.is_a)
You can see the new individual in the output along with its class.
onto.ModificationAction1 [onto.Action]
onto.modify [onto.Action]
P.S.: I'm assuming here that you have only one ontology -- onto
. If not, you should either 1) Have a lookup dictionary for ontologies to map "onto"
into actual ontology object/IRI, or 2) instead of “onto.”
prefix specify full IRI in your dataframe and lookup ontology by IRI.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论