Neo4j的数据的插入,查询操作很直观,不用再像之前要考虑各个表之间的关系。
提供的图搜索和图遍历方法很方便,速度也是比较快的。但是数据插入较慢
综上,Neo4j适合存储”修改较少,查询较多,没有超大节点“的图数据。
适合应用于创新实训:科研知识图谱助手的知识存储部分。
Neo4j基本概念
Neo4j 的数据由下面几部分构成:
- 节点
- 边
- 属性
在Neo4j中,节点以及边都能够包含保存值的属性,此外:
可以为节点设置零或多个标签
每个关系都对应一种类型(例如 WROTE 或 FRIEND_OF)
关系总是从一个节点指向另一个节点(但可以在不考虑指向性的情况下进行查询)
与关系型sql类比
标签看作是一个表,节点是关系中一行,属性是表的列,边是实体间的联系
CQL基本操作
与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)