Neo4j初探

2020-05-20 00:00:00 创建 数据 节点 导入 关系

近期需要处理图数据,考察后打算使用neo4j, 相比其他一些图数据库,neo4j开源,跨平台,接口友好,文档齐全,完整支持ACID。 首先放一张网上的图片,关系型数据库与图数据库存储网络数据的差异:

初次接触neo4j 踩了不少坑,这里记录一下。 关于如何安装Neo4j和使用web ui进行查询操作就不再赘述。

Cypher基本操作

相比关系型数据库的SQL查询语言,Neo4j的查询语言为Cypher,语法更加友好,更适合图数据做查询操作。首先介绍在图数据里面几个概念:

  • 节点(Node): 使用小括号表示(n)表示n这个节点,同时一般都会赋予节点某个标签(Label), 等同于关系书库里面的表名。比如(n: Person)表示n是一个Person类的节点,当然一个节点可以同时有多个label.
  • 关系(Relation):关系使用中括号表示[r:Knows]表示rKnows这种关系。两个节点的关系用--表示,如果有方向的话,加个箭头即可。如(a)-[r:Knowns]->(b)表示节点a和b之间有r关系,其中Knownsr的类型
  • 属性(Property): 节点和关系都可以附带属性,这个也是图数据库的优势,储存属性非常方便,直接用key-value表示即可。比如(n:Person{name:"John"})表示name为John的节点n。同样关系也可以有属性:[r:Knows]{year: 2018}表示为r赋予一个year属性。

几个常用的关键字介绍:

  • MATCH: 表示查询,是读数据库操作。比如查属于Person的节点:MATCH (n:Person),查找姓名为"John"的节点:MATCH (n:Person){name: "John"}或者使用where语句:MATCH (n:Person) WHERE n.name="John"。当然这里面很多语法可以使用,比如正则匹配等,这里就不再赘述了。当然在实际使用中,MATCH不能单独使用,需要结合RETURN
  • CREATE: 表示创建,可以新增节点,关系,索引,约束等等,是一种写操作。比如CREATE (n:Person{name:"Ana"})表示创建一个name为"Ana"的Person节点。在创建的同时可以设置属性:CREATE (n:Person{name:"Ana"}) set n.age=20。同样在某个属性上创建索引:CREATE INDEX ON :Person(name),这里需要提一下,尽量所有的Label都设置索引或者UNIQUE约束,在后续的读操作比如MATCH会大大提高性能(创建索引可以在导入节点之前执行)。
  • DELETE: 表示删除节点,关系等,也是写操作。一般需要结合MATCH匹配查询要删除的节点。MATCH (n:Person) DELETE n。如果在删除有关系的节点,这样删除会报错,可以先删除边MATCH (n:Person)-[r:KNOWS]->() DELETE r再删除节点。不过更推荐使用DETACH DELETE来级联删除,MATCH (n:Person) DETACH DELETE n可以同时删除节点及节点的关系。
  • MERGE:合并节点或者关系,属于先读后写操作,相当于MATCH + CREATE,先检查数据库中节点/关系是否存在,如果存在的话就不再创建,反之执行CREATE。如:MERGE(a:Person{name:"John"}) on create set a.age=20 //创建节点,先检测是否存在 // 给节点a,b建立关系,如果a,b已经存在,就无需新建。 MATCH (a:Person{name:"John"}), (b:Person{name:"Ana"}) MERGE (a)-[:KNOWS]->(b)

这几个只是基本的操作,在复杂查询中,会用到诸如WITH, UNWIND等命令。这里不再详细描述。

几个注意事项:

  • 节点名称与节点Label的定义容易混乱。比如CREATE (n:Person)创建了一个属于Person的节点n。这里的n仅仅属于一个变量名,跟节点本身没有关系,命令执行结束,n的生命周期也就结束了,而Person则是节点本身的Label,会一直存在。
  • 索引一定要建立

关于Neo4j浏览器的初次使用有几个快捷键:

  • 默认单行输入,按回车执行命令
  • 输入一行命令之后,按SHIFT + ENTER进入多行输入状态
  • 在多行输入时,CTRL + ENTER执行命令
  • ESC可以放大输入框至屏幕大小,复杂查询的时候,很方便。

关于内存配置的几个参数内存配置:

  • dbms.memory.heap.initial_size
  • dbms.memory.heap.max_size
  • dbms.memory.pagecache.size可以使用neo4j-admin memrec来根据当前数据库数据,查看推荐的内存配置
bin/neo4j-admin memrec --database=graph.db

相关文章