neo4j基础知识及用python(py2neo)交互

Neo4j的数据的插入,查询操作很直观,不用再像之前要考虑各个表之间的关系。
提供的图搜索和图遍历方法很方便,速度也是比较快的。但是数据插入较慢
综上,Neo4j适合存储”修改较少,查询较多,没有超大节点“的图数据。
适合应用于创新实训:科研知识图谱助手的知识存储部分。

Neo4j基本概念

Neo4j 的数据由下面几部分构成:

  • 节点
  • 属性

在Neo4j中,节点以及边都能够包含保存值的属性,此外:

可以为节点设置零或多个标签
每个关系都对应一种类型(例如 WROTE 或 FRIEND_OF)
关系总是从一个节点指向另一个节点(但可以在不考虑指向性的情况下进行查询)

与关系型sql类比
标签看作是一个表,节点是关系中一行,属性是表的列,边是实体间的联系

CQL基本操作

点击查看neo4j基本知识
参考博客

与sql类比

MATCH是select,后面加( <节点:标签>)代表从该标签中搜索满足条件(用where)的节点;
返回要用RETURN。例如,RETURN n.name,n.age

MATCH (dept: Dept)
RETURN dept.deptno,dept.dname,dept.location

创建唯一性约束,同时具有索引效果,类似关系型数据库中的主键。注意,这只能在数据库中还未插入数据时设置。

CREATE CONSTRAINT ON (a:Person) ASSERT a.name IS UNIQUE;

创建索引。

CREATE INDEX ON :Person(name);

查看所有的节点数和边数

MATCH (n) RETURN count(n);
MATCH ()-->() RETURN count(*);

插入节点。插入一个Person类别的节点,且这个节点有一个属性name,属性值为Andres

CREATE (n:Person { name : 'Andres'});

插入边

MATCH (a:Person),(b:Person)
WHERE a.name = 'Node A' AND b.name = 'Node B'
CREATE (a)-[r:Follow]->(b);

更新节点。更新一个Person类别的节点,设置新的name。

MATCH (n:Person { name: 'Andres' })
SET n.name = 'Taylor';

删除节点和与其相连的边。Neo4j中如果一个节点有边相连,是不能单单删除这个节点的。

MATCH (n:Person { name:'Andres' })
DETACH DELETE n;

删除边。

MATCH (a:Person)-[r:Follow]->(b:Person)
WHERE a.name = 'Andres' AND b.name = 'Taylor'
DELETE r;

有以下几种关系型写法:

-[rel:KNOWS]-> //单关系,关系的变量名为rel,类型是 KNOWS
(a)-[:KNOWS|:LIKE]->(b) //查询a到b的两类关系
-[{since:2010}]-> //附加属性
-[:KNOWS*..4]-> example: a -[rel: type*minHop..maxHop]-> b  
//从a节点到b节点最少可经过minHop、最大可经过maxHop个节点
MATCH (n1:Label1)-[rel:TYPE]->(n2:Label2)
WHERE rel.property > {value}
RETURN rel.property, type(rel)

作为图形数据库,有一些独有的查询语句

最短路径。

MATCH (ms:Person { name:'Andres' }),(cs:Person { name:'Taylor' }),
 p = shortestPath((ms)-[r:Follow]-(cs)) 
RETURN p;

查询两个节点之间的关系。

MATCH (a:Person { name:'Andres' })-[r]->(b:Person { name:'Taylor' }) 
RETURN type( r);

查询一个节点的所有Follower。

MATCH (:Person { name:'Taylor' })-[r:Follow]->(Person)
RETURN Person.name;

清空所有数据(删除所有节点和关系)

MATCH (n)
OPTIONAL MATCH (n)-[r]-()
DELETE n,r

Windows中直接删除data/databases/graph.db或其他指定db中的全部数据即可。

union的用法

MATCH (keyword:Keyword{name:'人工智能'})-[:Keyword]->(paper:Paper) return paper as a
union 
MATCH (keyword2:Keyword{name:'机器学习'})-[:Keyword]->(paper2:Paper) return paper2 as a

分组聚合(group by)

match (n:Person) return n.born,count(*)
match (:Keyword{name:'人工智能'})-[:is_Keyword_to]->(n:Paper)
return n.year,count(*)

创建新的数据库

在$NEO4J_HOME\conf的目录编辑neo4j.conf。搜寻dbms.active_database=,其默认值应为graph.db。用其他名称替换它,然后再次启动neo4j。现在,将在该目录名下创建一个新数据库。若要切换回以前的db,请重复这些步骤,只需将新值替换为graph.db在配置文件中。
注意:如果在neo4j启动的时候修改了配置文件,则需要重新启动一次,浏览器页面才会更新。

Cypher完整案例

Cypher完整案例csv导入、关系联通、高级查询
导入csv

首先从MySQL数据库导出csv文件,复制到import文件夹E:\Program Files (x86)\neo4j-community-3.4.0\import里,然后执行下列语句:
逐个导入节点(按照标签)

LOAD CSV WITH HEADERS  FROM "file:///movie.csv" AS line  
MERGE (p:Movie{mid:toInteger(line.mid),title:line.title,introduction:line.introduction,
rating:toFloat(line.rating),releasedate:line.releasedate})//注意类型转换

逐个导入关系

// 导入关系 actedin  电影是谁参演的 1对多
LOAD CSV WITH HEADERS FROM "file:///person_to_movie.csv" AS line 
match (from:Person{pid:toInteger(line.pid)}),(to:Movie{mid:toInteger(line.mid)})  
merge (from)-[r:actedin{pid:toInteger(line.pid),mid:toInteger(line.mid)}]->(to)

查询一级关系
match q=(n:A{name:‘宅院2’})-[]-()return q;

查询两级关系
match q=(n:A{name:‘宅院2’})-[]-(),p=(n:A{name:‘宅院2’})-[]-()-[]-() return p,q;

py2neo基本使用

py2neo V4 极简使用指南:Python操作Neo4j图数据库
参考博客
大概使用

创建节点、关系;添加到neoj4图数据库;利用py2neo查询;修改时可以用OGM方式(创建对象与Node进行映射,修改变量)

创建

from py2neo import Node, Relationship
a = Node("Person", name="Alice")
b = Node("Person", name="Bob")
ab = Relationship(a, "KNOWS", b)

Node 和 Relationship 都继承了 PropertyDict 类,它可以赋值很多属性,类似于字典的形式
连接已有图数据库 - .Graph()

test_graph = Graph(
    "http://localhost:7474", 
    username="neo4j", 
    password="xxxx"
)
```test_graph,就连接上了电脑中默认的图数据库,就可以进行查询了

from py2neo import Graph, Node, Relationship
 
graph = Graph(password='123456')
a = Node('Person', name='Alice')
graph.create(a)
b = Node('Person', name='Bob')
ab = Relationship(a, 'KNOWS', b)
graph.create(ab)
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值