概要

之前在CSDN上写过一个blog(http://blog.csdn.net/wrzcy/article/details/51905977 ),简单的介绍了Neo4j图形数据库,主要是以基础概念和定义为主。今天就通过python面向Neo4j的库py2neo来对Neo4j进行一些简单的操作,包括:

  • 连接Neo4j数据库
  • 节点的建立
  • 节点之间关系的建立
  • 关系属性赋值以及属性值的更新
  • 通过属性值查找节点/关系
  • 通过节点/关系查找相关联的节点/关系
  • 结合目前的一个项目来说说一些坑和注意点

连接Neo4j数据库

要通过python来操作Neo4j,首先需要安装py2neo,可以直接使用pip安装。

pip install py2neo

在完成安装之后,在python中调用py2neo即可,常用的有Graph,Node,Relationship。

from py2neo import Graph,Node,Relationship

连接Neo4j的方法很简单:

test_graph = Graph("http://localhost:7474", username="neo4j", password="neo4j"
)

test_graph就是我们建立好的Neo4j的连接。
Neo4j的服务器装好了之后,默认的端口号就是7474,所以本地的主机就是"http://localhost:7474" 。
默认的用户名密码都是neo4j,不过也可以在浏览器中进入http://localhost:7474 ,首次进入会提示你进行密码修改。

节点的建立

节点的建立要用到py2neo.Node,建立节点的时候要定义它的节点类型(label)以及一个基本属性(property,包括property_key和property_value)。以下代码为建立了两个测试节点。

test_node_1 = Node(label = "Person",name = "test_node_1")
test_node_2 = Node(label = "Person",name = "test_node_2")
test_graph.create(test_node_1)
test_graph.create(test_node_2)

这两个节点的类型(label)都是Person,而且都具有属性(property_key)为name,属性值(property_value)分别为"test_node_1","test_node_2"。

节点间关系的建立

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

node_1_call_node_2 = Relationship(test_node_1,'CALL',test_node_2)
node_1_call_node_2['count'] = 1
node_2_call_node_1 = Relationship(test_node_2,'CALL',test_node_1)
node_2_call_node_1['count'] = 2
test_graph.create(node_1_call_node_2)
test_graph.create(node_2_call_node_1)

如以上代码,分别建立了test_node_1指向test_node_2和test_node_2指向test_node_1两条关系,关系的类型为"CALL",两条关系都有属性count,且值为1。

在这里有必要提一下,如果建立关系的时候,起始节点或者结束节点不存在,则在建立关系的同时建立这个节点。

节点/关系的属性赋值以及属性值的更新

节点和关系的属性初始赋值在前面节点和关系的建立的时候已经有了相应的代码,在这里主要讲述一下怎么更新一个节点/关系的属性值。

我们以关系建立里的 node_1_call_node_2 为例,让它的count加1,再更新到图数据库里面。

node_1_call_node_2['count']+=1
test_graph.push(node_1_call_node_2)

更新属性值就使用push函数来进行更新即可。

通过属性值来查找节点和关系(find,find_one)

通过find和find_one函数,可以根据类型和属性、属性值来查找节点和关系。
示例如下:

find_code_1 = test_graph.find_one(label="Person",property_key="name",property_value="test_node_1"
)
print find_code_1['name']

find和find_one的区别在于:
find_one的返回结果是一个具体的节点/关系,可以直接查看它的属性和值。如果没有这个节点/关系,返回None。
find查找的结果是一个游标,可以通过循环取到所找到的所有节点/关系。

通过节点/关系查找相关联的节点/关系

如果已经确定了一个节点或者关系,想找到和它相关的关系和节点,就可以使用match和match_one。

find_relationship = test_graph.match_one(start_node=find_code_1,end_node=find_code_3,bidirectional=False)
print find_relationship

如以上代码所示,match和match_one的参数包括start_node,Relationship,end_node中的至少一个。

bidirectional参数的意义是指关系是否可以双向。
如果为False,则起始节点必须为start_node,结束节点必须为end_node。如果有Relationship参数,则一定按照Relationship对应的方向。
如果为True,则不需要关心方向问题,会把两个方向的数据都返回。

match_relation  = test_graph.match(start_node=find_code_1,bidirectional=True)
for i in match_relation:print ii['count']+=1test_graph.push(i)

如以上代码所示,查找和find_code_1相关的关系。
match里面的参数只写了start_node,bidirectional的值为True,则不会考虑方向问题,返回的是以find_code_1为起始节点和结束节点的所有关联关系。
如果,bidirectional的值为False,则只会返回以find_code_1为起始节点的所有关联关系。

结合项目浅谈Neo4j里值得注意的地方

写这篇blog主要也是因为最近再做一个关系查找的数据库,在使用Neo4j的时候还是自己挖了不少坑愉快的跳了下去然后到处挣扎。不过大部分的情况下终归还是能爬出来,在这里把遇到的一些问题和值得注意的地方分享出来,希望别人不要走我的老路。

关于节点和关系的建立

建立节点和关系之前最好先查找一下是否已经存在这个节点了。如果已经存在的话,则建立关系的时候使用自己查找到的这个节点,而不要新建,否则会出现一个新的节点。

如果一条条建立关系和节点的话,速度并不快。如果条件合适的话,最好还是用Neo4j的批量导入功能。不过因为在本项目里面并不适合使用批量导入功能,所以只能一条条的插入。

关于索引

在Neo4j 2.0版本以后,尽量使用schema index,而不要使用旧版本的索引。

最好在插入数据之前就建立好索引,否则索引的建立会很消耗时间。

索引建立是非常有必要的,一个索引可以很大程度上降低大规模数据的查询速度。

以我自己为例,这次做项目的时候因为第一次没有加入索引,当数据规模达到4w节点,7w+关系的时候,查询一个节点以及相关联的节点关系所消耗的时间已经达到了1s。

在对节点按照name属性建立了索引之后,截止我写这篇blog的时候,数据量为节点600w+,关系1100w+,查询一个节点以及相关联的节点关系消耗的时间和数据量很小的时候几乎没有什么差别,基本上都稳定在16~20ms左右。

关于Neo4j应当插入的数据内容

我们在使用图数据库的时候必须要明确一点,图数据库能够帮助我们的是以尽量快的速度找出来不同的节点之间的关系。因此向一个节点或者关系里面插入很多其余无关的数据是完全没有必要的,会很大程度浪费硬盘资源,在检索的时候也会消耗更多的时间。

仍旧是以我这次的项目为例。截止到写这篇blog时已经向里面导入了2w条原始数据,我导入的每条数据中,有大量的跟关联关系无关的其他数据,但是这些都是没有必要的冗余数据,完全不需要向Neo4j里面插入。

在最后我设计的图数据库里,节点类型为Person,每个节点只有一个属性name,标志这个节点。每两个节点之间最多只会有一来一回两条关系,表示主从关系。

通过这样的图,我们想要检索任何节点的关联节点都可以很快速的找到,而且可以很清楚的区分哪些节点的联系比较紧密。

如果要把其他的不必要的数据插入进去,跟2w条原始数据对应的600w+的节点和1100w+的关系,必然会占用大量的存储空间,也会大幅增加查询的时间。

所以务必牢记,图数据库的本质是为了方便查找不同的人或者事物之间的关系的,而不是为了存储数据的。

作者:Gun_Fox
链接:http://www.jianshu.com/p/a2497a33390f
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

py2neo——Neo4jpython的配合使用相关推荐

  1. py2neo—Neo4jpython的配合使用

    今天就通过python面向Neo4j的库py2neo来对Neo4j进行一些简单的操作,包括: 连接Neo4j数据库 节点的建立 节点之间关系的建立 关系属性赋值以及属性值的更新 通过属性值查找节点/关 ...

  2. 小程序云开发,判断数据库表的两个字段匹配 云开发数据库匹配之 and 和 or 的配合使用

    云开发数据库匹配之 and 和 or 的配合使用 代码: // 获取成员消息onMsg2() {let that = thiswx.cloud.init({env: 'gezi-ofhmx'})con ...

  3. 烂泥:net use与shutdown配合使用,本机重启远程服务器

    烂泥:net use与shutdown配合使用,本机重启远程服务器 今天服务器出现问题了,能ping通,但就是远程登录服务器后,服务器无法响应. 在本机测试发现ftp服务可以使用,于是就想通过ftp就 ...

  4. call指令和ret指令的配合使用

    call指令和ret指令的配合使用 转载于:https://www.cnblogs.com/LoveFishC/archive/2012/07/28/3846633.html

  5. Delphi控件之---UpDown以及其与TEdit的配合使用(比如限制TEdit只能输入数字,还有Object Inspector之组件属性的介绍)...

    最近在开发中使用到了UpDown这个控件,但是因为之前没有使用过,所以很不熟悉,于是就编写了一个简单的demo来学习UpDown以及其结合TEdit的用法. 初步的常用功能的简介 目前(2015.08 ...

  6. tab与list配合使用

    tab与list配合使用会使效果增添不少,可是在之前没有接触过此框架的要做到很好却是有点小难度,以下就按我在开发过程中遇到的问题,一一罗列出来,并附上解决的方法. 如图:               ...

  7. [知识图谱]利用py2neo从Neo4j数据库获取数据

    1 # -*- coding: utf-8 -*- 2 3 from py2neo import Graph 4 import json 5 import re 6 7 8 class Neo4jTo ...

  8. py2neo 基本用法

    py2neo 基本用法 #coding:utf-8 from py2neo import Graph,Node,Relationship##连接neo4j数据库,输入地址.用户名.密码 graph = ...

  9. 项目使用了redis还需要mysql_【11-05】lnmp项目中Redis和Mysql配合使用应该注意哪些问题?...

    [今日话题] lnmp项目中Redis和Mysql配合使用应该注意哪些问题? - 刺客 1. 我这边因为项目小,主要用redis充当mysql的缓存使用,把活跃数据预读到redis中,这样绝大部分的请 ...

最新文章

  1. 第3章 深入理解盒子模型
  2. stm32显示flash下载失败_STM32大神笔记,超详细单片机学习汇总资料(干货分享4)...
  3. python所有模块图解_Python模块结构和布局
  4. python3.5安装教程-Python 3.5安装教程
  5. java如何定义一个字符栈_Java性能优化之字符串优化处理
  6. app测试之耗电量测试
  7. Docker容器环境下ASP.NET Core Web API应用程序的调试
  8. 跨站请求伪造(CSRF/XSRF)
  9. VMware vCloud® Suite 5.5功能介绍
  10. 原 jQuery基础修炼圣典—DOM篇
  11. 文字排版不可不看的优秀案例合集
  12. ZOJ 3635 Cinema in Akiba[ 大规模阵列 ]
  13. 【翻译】Brewer's CAP Theorem CAP定理
  14. SQLSERVER使用密码加密备份文件以防止未经授权还原数据库
  15. Redis ,Memcached ,Mongodb 对比
  16. IEC60958/61937协议
  17. 有哪些文艺而有韵味的句子?
  18. iPi Soft: Motion Capture for the Masses(大众化的运动捕捉软件)
  19. 软件性能测试模拟笔试题目
  20. 记录阿里云虚拟主机FTP连接不上的解决办法

热门文章

  1. Ubuntu18.04 显卡GF-940MX安装NVIDIA-390.77
  2. 我吃的肉里都有量子力学了?
  3. R语言多元Copula GARCH 模型时间序列预测
  4. 厦大生物科学类要考计算机等级吗,厦门大学生命科学学院调剂经验分享
  5. git 初次使用的配置流程
  6. 安东尼罗宾--激发你的无限潜能[连载]--1 2章
  7. DELL Inspiron(灵越)14-5648拆机指南
  8. 程序员之天梯排行榜,你在哪一级?榜首无悬念!
  9. 2021新泰一中高考成绩查询,山东泰安赫赫有名的4所高中,成绩一目了然,第一名花落谁家?...
  10. Codeforces1397 E. Monster Invaders(dp)