知识图谱现学现用(Django 2.2 + Neo4j 3.5)

Posted 骑着哈哥去旅行

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识图谱现学现用(Django 2.2 + Neo4j 3.5)相关的知识,希望对你有一定的参考价值。

最近公司想要开发一款有关知识图谱的构建工具,以前没有接触过neo4j的我只能现学现用。闲话少说,只撸干货😎。

一、Neo4j图数据库搭建

1.1 Neo4j概述

       Neo4j是一个高性能的NOSQL图形数据库,它将结构化数据存储在网络上而不是表中。它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络(从数学角度叫做图)上而不是表中。Neo4j也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。程序员工作在一个面向对象的、灵活的网络结构下而不是严格、静态的表中——但是他们可以享受到具备完全的事务特性、企业级的数据库的所有好处。Neo4j因其嵌入式、高性能、轻量级等优势,越来越受到关注.

1.2 Neo4j搭建

1.2.1 tar包安装

Neo4j是基于Java的图形数据库,运行Neo4j需要启动JVM进程,因此必须安装JAVA SE的JDK。

linux服务器配置:

 java版本:

 neo4j版本:

 (1)下载

liunx环境Neo4j下载地址:Neo4j Download Center - Neo4j Graph Data Platform社区版免费)

 

或者直接在服务器上使用命令下载:

curl -O http://dist.neo4j.org/neo4j-community-3.5.35-unix.tar.gz

(2)解压安装

tar -axvf neo4j-community-3.5.35-unix.tar.gz

(3)修改配置

配置文件在neo4j-community-3.5.35/conf目录下

修改第22行load csv时的路径,在前面加个#,可从任意路径读取文件

#dbms.directories.import=import

 修改54行,去掉改行的#,可以远程通过ip访问neo4j数据库

dbms.connectors.default_listen_address=0.0.0.0

 修改245行,去掉#,允许从远程url来load csv

dbms.security.allow_csv_import_from_file_urls=true

 修改265行,设置neo4j可读可写

dbms.read_only=false

 (4)启动

进入neo4j-community-3.5.35/bin目录下

启动neo4j

/bin/sh ./neo4j start

 

./neo4j 参数说明
start启动
status查看状态
stop停止
restart重启

(5)客户端访问

http://服务器ip地址:7474/browser/

在浏览器访问图数据库所在的机器上的7474端口(第一次访问账号neo4j,密码neo4j,会提示修改初始密码)

 

1.2.2 docker安装

docker run -d --name neo4j_3.5.22 -p 7474:7474 -p 7687:7687 --restart=always -v /external_use/hepengli/neo4j/data:/data -v /external_use/hepengli/neo4j/logs:/logs -v /external_use/hepengli/neo4j/conf:/var/lib/neo4j/conf -v /external_use/hepengli/neo4j/import:/var/lib/neo4j/import neo4j:3.5.22-community

二、py2neo连接Neo4j

先在使用的虚拟python环境中安装py2neo库

pip install py2neo -i https://pypi.mirrors.ustc.edu.cn/simple/

 在Django的settings.py配置文件中进行配置

from py2neo import Graph

...........
#                           ip地址     端口         neo4j账号   密码
graph = Graph("bolt://192.168.220.128:7687", auth=("neo4j", "123456"))  # 连接neo4j图数据库

三、基本使用

温馨提示:以下Debugger出的数据全是小编随便写的测试数据,请不要在意。

首先对要对进行使用的地方根据实际情况进行导入

 3.1 创建节点

test = Node("Person",name = "大明") 
 
graph.create(test)

 3.2 给节点添加属性

data = 
        'name': 'Amy',
        'age': 23
    
test.update(data)
graph.push(test)

 3.3 添加关系

节点间的关系(Relationship)是有向的,所以在建立关系的时候,必须定义一个起始节点和一个结束节点。起始节点可以和结束节点是同一个点,这时候的关系就是这个点指向它自己。


relation = Relationship(test1,'喜欢',test2) 
 
graph.create(relation)

 3.4 节点删除

graph.delete(test)  #删除特定节点test

graph.delete_all()  #删除所有节点

3.5 查询所有节点和属性信息

MATCH (p) RETURN p LIMIT 25

graph.run("MATCH (p) RETURN p LIMIT 25").data()

3.6 查询所有节点和属性信息以及节点之间的关系

MATCH p=()-->() RETURN p LIMIT 25

all_relations = graph.run("MATCH p=()-->() RETURN p LIMIT 25").data()

 3.7 查询指定labels(如:Person)所有节点和属性信息

MATCH (p:`Person`) RETURN p LIMIT 25

graph.run(f"MATCH (p:node_labels) RETURN p LIMIT 25").data()

 3.8 查询指定关系(如:喜欢)所有节点和属性信息以及节点之间的关系

MATCH p=()-[r:`喜欢`]->() RETURN p LIMIT 25

graph.run(f"MATCH p=()-[r:relationship_types]->() RETURN p LIMIT 25").data()

 3.9 查询指定条件的节点和属性信息

如查询name为小王的节点信息

node_matcher = NodeMatcher(graph)
node_matcher.match().where(name=`小王`).first()

3.10 查询与指定节点有关系的其他节点

MATCH p=(x)-[*1..1]-() WHERE x.name = '小王' RETURN p LIMIT 25

graph.run("MATCH p=(x)-[*1..1]-() WHERE x.name = '%s' RETURN p LIMIT 25" % node1.get('name')).data()

 3.11 查询从一个节点到另一个节点的双向路径

MATCH p=(a)-[*]-(b) WHERE a.name='小王' AND b.name='小张' RETURN p LIMIT 25

graph.run(f"MATCH p=(a)-[*]-(b) WHERE a.name='entity_start_name' AND b.name='entity_end_name' RETURN p LIMIT 25").data()

 3.12 查询从一个节点到另一个节点的单向路径

MATCH p=(a)-[*]->(b) WHERE a.name='小王' AND b.name='小张' RETURN p LIMIT 25

graph.run(f"MATCH p=(a)-[*]->(b) WHERE a.name='entity_start_name' AND b.name='entity_end_name' RETURN p LIMIT 25").data()

 3.13 获取两个节点之间的关系字符串

 至此,这就是我用到的一些操作,希望对您有帮助!

以上是关于知识图谱现学现用(Django 2.2 + Neo4j 3.5)的主要内容,如果未能解决你的问题,请参考以下文章

快速入门知识图谱 - Neo4J Cypher查询语言教程

快速入门知识图谱 - Neo4J Cypher查询语言教程

快速入门知识图谱 - Neo4J Cypher查询语言教程

《自然语言处理实战入门》 基于知识图谱的问答机器人

现学现用-我的第二个小小小私活

手把手教你快速入门知识图谱 - Neo4J教程