gin上传excel文件到neo4j

背景

写了个图谱管理系统,有上传excel到数据库的功能,所以才开发此功能

实现

所用库

  • github.com/360EntSecGroup-Skylar/excelize
  • github.com/johnnadratowski/golang-neo4j-bolt-driver

代码

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
func (c *gin.Context) {
file, _, err := c.Request.FormFile("csv_file")
fmt.Println(file)
rows, err := importExl(file)
if err == nil {
var nodeCypherList []string
var nodeRepList []string
for irow, row := range rows {

if irow > 0 {
// 组装cypher语句
cypherNode := fmt.Sprintf(
`MERGE (n:Node {knowledge_id: "%s",description: "%s"})`,
row[2], row[3])

nodeCypherList = append(nodeCypherList, cypherNode)
if len(row[6]) != 0 {
beforeKnowledgeIDs := strings.Split(row[6], "&")
for _, bkID := range beforeKnowledgeIDs {
cypherNodeBefore := fmt.Sprintf(
`MATCH (a:Node), (b:Node)
WHERE a.knowledge_id = "%s" AND b.knowledge_id = "%s"
MERGE (b)-[r:%s{}]->(a)
RETURN r`,
row[2], bkID, row[0])

nodeRepList = append(nodeRepList, cypherNodeBefore)
}
}

}
}
// 写入数据库 start
// models.DB = driver.NewDriver().OpenNeo(neo4jURL)
tx, _ := models.DB.Begin()
nilList := make([]map[string]interface{}, len(nodeCypherList))
models.DB.ExecPipeline(nodeCypherList, nilList...)
tx.Commit()
// 写入数据库 end
if len(nodeRepList) != 0 {
tx, _ := models.DB.Begin()
nilList := make([]map[string]interface{}, len(nodeRepList))
models.DB.ExecPipeline(nodeRepList, nilList...)
tx.Commit()
}
c.JSON(http.StatusOK, gin.H{
"message": "success",
"code": http.StatusOK,
})
} else {
c.JSON(http.StatusBadRequest, gin.H{
"error": err.Error(),
"message": "PrepareNeo",
"code": http.StatusBadRequest,
})
}
}

// 读取excel的函数
func importExl(r io.Reader) ([][]string, error) {
xlsx, err := excelize.OpenReader(r)
if err != nil {
return nil, err
}
rows := xlsx.GetRows(xlsx.GetSheetName(1))
return rows, nil
}