查找知识图谱中的实例知识
知识图谱是一种结构化的语义网络,用于描述物理世界中的概念及其实例的相关关系。可以把知识图谱看成是一种有向图,图中的点是概念或实例,图中的边是概念及其实例的相关关系。
现定义一种简单的知识图谱
概念:包括父概念及其子概念,通过subClassOf关系关联,父子概念可以有多个层级;
实例:仅和概念之间通过instanceOf关系关联:
关系:以三元组的形式表示,三元组是一个以空格为成员间分隔符的字符串。例如"student subClassOf person"表示student是person的子概念,“apple instanceOf fruit"表示apple是概念fruit的实例。
给定一个知识图谱,请编写一个方法,可以根据一个概念查找其所有的实例。如果一个概念拥有子概念,那么返回的结果需要包含其所有子概念的实例;如果输入的概念没有实例,则返回字符串"empty”(说明:输出字符串文本不需要包含引号)。
给定的图谱满足以下限制:
1、有向图中不存在环路
2、所有点和关系的定义对大小写敏感
输入描述:
输入第1行,表示图谱中关系的数量n,取值范围[1,10000]
从第2行到n+1行,表示图谱中的关系,每一行是一个关系三元组第n+2行,表示待查找的元节点,是关系三元组中存在的点。
每行字符的长度不超过100。
3
student subClassOf person
Tom inslenceOf student
Marry instanceOf person
person
输出描述
按字典序升序排列的字符串数组,其内容是概念及其子概念的所有实例。
Marry Tom
代码
class Tree:
def __init__(self, x):
self.instance = []
self.subclass = None
self.id = x
def func():
data = [
'student subClassOf person',
'Tom instanceOf student',
'Marry instanceOf person',
'chriden subClassOf student',
'Bob instanceOf chriden',
'person'
]
# data = [
# 'apple instanceOf fruit',
# 'fruit'
# ]
data_dict = {}
for i in range(len(data) - 1):
left, mid, right = data[i].split(' ')
if mid == 'subClassOf': # 那么left 和 right 两个肯定都是概念,父子关系
if right not in data_dict.keys():
right_tree = Tree(right)
data_dict[right] = right_tree
if left not in data_dict.keys():
left_tree = Tree(left)
data_dict[left] = left_tree
data_dict[right].subclass = data_dict[left]
if mid == 'instanceOf':
if right not in data_dict.keys():
right_tree = Tree(right)
data_dict[right] = right_tree
data_dict[right].instance.append(str(left))
head = data_dict[data[-1]]
result = []
while(head):
result += head.instance
head = head.subclass
result = sorted(result)
print(result)
if __name__ == '__main__':
func()