阅读量:0
一. 简介
当我们使用neo4j构建知识图谱时,我们希望让别人能和我们共用neo4j进行知识图谱的构建,我们的方法之一就是将neo4j部署到我们的服务器上,然后将7474,7687端口暴露出来,这样就可以通过访问服务器公网IP的7474端口来操作我们的数据库。
二. 服务器的设置
1. 首先我们需要有一个自己的服务器
推荐使用2核4G内存的服务器,因为在实际操作过程中B哥因为贪便宜使用2核2G的服务器踩了大坑——服务器内存完全不够用,即使我仅仅创建了一个 47 节点的图谱,但是由于大量进程占用导致剩余空闲内存很少:
然后就会导致neo4j频繁的停止运行。如果我们使用2核4G的服务器来运行:
可以看到空闲内存如此之富裕,简直就是稳稳地幸福。当然作为赛博垃圾佬,购置服务器前B哥建议大家可以先去小黄鱼碰碰运气。
2. 服务器配置
然后系统什么的CentOS,Ubuntu随便选一个Linux的就行了,然后使用
java --version
查看jdk版本
然后根据jdk版本来下载对应的neo4j版本:
jdk 8 - neo4j 3.x
jdk 11 - neo4j 4.x
其他的的忘记了自行去官网搜索。
3. 然后我们就可以下载neo4j了
- 更新软件包
sudo apt update sudo apt upgrade -y
- 下载neo4j服务器版本安装包(因为是Linux操作系统)
wget -O - https://debian.neo4j.com/neotechnology.gpg.key | sudo apt-key add - echo 'deb https://debian.neo4j.com stable 4.4' | sudo tee /etc/apt/sources.list.d/neo4j.list sudo apt update
- 安装neo4j
sudo apt install neo4j
4. 接下来我们需要去服务器安全组放行7474端口和7687端口
三. neo4j配置
我们需要找到位于neo4j目录下的conf文件,然后使用vim编辑器打开,配置如下:
- 打开注释:
- 修改
然后运行
sudo systemctl start neo4j
查看状态:
sudo systemctl status neo4j
这样就运行成功了。然后就可以使用浏览器,以如下格式
http://服务器公网ip:7474/
访问到neo4j,ui界面。然后登录密码和账号初始都是: neo4j
然后就可以看到neo4j UI界面:
四. 导入数据集
其实数据集有多种导入形式,我这里就导入xlsx了,我使用的是golang
package main import ( "fmt" "github.com/tealeg/xlsx" //"github.com/neo4j/neo4j-go-driver/v4/neo4j" "github.com/neo4j/neo4j-go-driver/v5/neo4j" "log" ) // 定义数据结构 type Clause1 struct { Subject string `json:"subject"` Predicate string `json:"predicate"` Objects []Object `json:"object"` } type Object struct { Name string `json:"name"` } type Clause struct { Node1 string Relationship string Node2 string } func main() { uri := "bolt://服务器公网ip:7687" username := "neo4j用户名" password := "neo4j密码" ReadExcel(uri, username, password, "D:\\Projects\\Go_Projects\\MKdomain\\规划行业知识图谱设计demov2.1.xlsx") } func ReadExcel(uri, username, password, filepath string) { // 连接Neo4j driver, err := neo4j.NewDriver(uri, neo4j.BasicAuth(username, password, "")) if err != nil { log.Fatalf("Failed to create driver: %v", err) } defer driver.Close() // 验证连接 session := driver.NewSession(neo4j.SessionConfig{AccessMode: neo4j.AccessModeWrite}) defer session.Close() // 读取Excel文件 filePath := filepath xlFile, err := xlsx.OpenFile(filePath) if err != nil { log.Fatalf("无法打开数据集: %v", err) } sheet := xlFile.Sheets[0] //len(sheet.Rows); for i := 1; i < len(sheet.Rows); i++ { var emptyRow = true var clause Clause for idx, cell := range sheet.Rows[i].Cells { text := cell.String() if text != "" { emptyRow = false } switch idx { case 0: clause.Node1 = text case 1: clause.Relationship = text case 2: clause.Node2 = text } } if emptyRow { log.Fatalf("the node1 is: %v, the node2 is: %v, the relationship is: %v, the cloumn is: %d.", clause.Node1, clause.Node2, clause.Relationship, i) } cypher := ` MERGE (n1:Node {name: $node1}) MERGE (n2:Node {name: $node2}) MERGE (n1)-[:` + clause.Relationship + `]->(n2) ` params := map[string]interface{}{ "node1": clause.Node1, "node2": clause.Node2, } // 写入数据库 _, err := session.WriteTransaction(func(tx neo4j.Transaction) (interface{}, error) { res, err := tx.Run(cypher, params) if err != nil { return nil, err } if res.Next() { fmt.Println("数据插入完成") } return nil, res.Err() }) if err != nil { log.Fatalf("err: %v", err) } } }