当前位置:   article > 正文

使用python读取Excel数据,并创建到neo4j数据库知识图谱_知识图谱调用excel

知识图谱调用excel

最近研究课题需要创建知识图谱,用python写了一篇代码,主要作用是从excel文件中读取节点和节点之间的关系,并创建到neo4j数据库中,最终效果是这样。
只有节点,没做太多属性

# coding:utf-8
import xlwt
import xlrd
from py2neo import Graph, Node, Relationship

##连接neo4j数据库,输入地址、用户名、密码
graph = Graph('http://localhost:7474', username='neo4j', password='root')

book = xlrd.open_workbook('桥梁结构及其病害整理.xlsx')
workSheetName = book.sheet_names() # ['桥梁结构', '桥梁病害', '桥梁结构关系', '病害关系', '桥梁和病害的关系']
print("Excel文件包含的表单有:"+str(workSheetName))


# 根据指定的表单名,一行一行获取指定表单中的所有数据,表单名为worksheetname
def GetAllSheetCellValue(worksheetname):
    bridgeStructure = book.sheet_by_name(worksheetname)
    AllsheetValue = []
    for i in range(bridgeStructure.nrows):
        for j in range(bridgeStructure.ncols):
            AllsheetValue.append(bridgeStructure.cell_value(i,j))
    # print("《"+str(worksheetname)+"》"+"数据获取成功,请指定变量接收")
    return AllsheetValue

# 根据指定的表单名,按列获取表单中的数据
def GetAllSheetValueByColum(worksheetname):
    bridgeStructure = book.sheet_by_name(worksheetname)#获取指定名称的表单
    col_nums = bridgeStructure.ncols #获取指定表单的有效列数
    # print(bridgeStructure)
    AllsheetValue = []
    for i in range(col_nums):
        AllsheetValue.append(bridgeStructure.col_values(i))
    # print(AllsheetValue)
    return AllsheetValue

# 创建一个指定节点类,名字,创建节点,其他属性有需要自定拓展这个方法
def CreateNode(className,lableName,name):
    test_node= Node(className,lable = lableName, name=name)
    graph.create(test_node)

# 指定表名,类名,名字,批量创建节点
def CreateNodes(worksheetname,lableName,ClassName):
    sheetvalue = GetAllSheetCellValue(worksheetname)
    nums = 0
    for i in range(len(sheetvalue)):
        CreateNode(ClassName,lableName,sheetvalue[i])
        nums+=1
    print("创建"+worksheetname+"节点成功,总计创建%s个"%(nums))

# 根据需要创建节点的表名个数(有几个表就传输参数是几),批量创建节点,这个方法中默认构件类名就是图谱中的类名
# 参数说明 nums:在一个Excel文件中的需要创建节点的表单数
def CreateNodesBySheetNums(nums):
    for i in range(nums):
        CreateNodes(workSheetName[i], workSheetName[i],workSheetName[i])

#建立两个节点之间的关系
#参数说明 node1:节点1,node2:节点2,relationship:节点之间的关系
def CreateTwoNodeRelationship(node1,node2,relationship):
    relation = Relationship(node2, relationship, node1)
    graph.create(relation)

# 根据Excel文件中两个对象列表和一个关系列表,建立两个列表之间的子类(subclassof)关系
# 参数说明 worksheetname:指定的表单名,className1:第一个类的名称,className2:第二个类的名称
def subclassRelationship(worksheetname, className1,className2):
    list1 = GetAllSheetValueByColum(worksheetname)[0]
    list2 = GetAllSheetValueByColum(worksheetname)[2]
    relationship = GetAllSheetCellValue(worksheetname)[1]
    print(list1,relationship,list2)
    # 利用Python执行CQL语句
    # graph.run("match(a:桥梁结构),(b:桥梁病害)  where a.name='支座' and b.name='冲蚀'  CREATE (a)-[r:DIRECTED]->(b)")

    num=0
    for i in range(len(list1)):
        num+=1
        graph.run("match(a:%s),(b:%s)  where a.name='%s' and b.name='%s'  CREATE (a)-[r:%s]->(b)"%(className1,className2,str(list2[i]),str(list1[i]),str(relationship)))
    print('创建%d个关系成功'%(num))

CreateNodesBySheetNums(2)
subclassRelationship(workSheetName[2],"桥梁结构","桥梁结构")
subclassRelationship(workSheetName[3],"桥梁病害","桥梁病害")
subclassRelationship(workSheetName[4],"桥梁病害","桥梁结构")

print("程序运行完成")

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83

我不知道怎样上传Excel文件,需要关注微信公众号【BIM技术应用交流】回复“知识图谱”拿到Excel文件下载链接。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/161250
推荐阅读
相关标签
  

闽ICP备14008679号