图数据库Neo4j

基本概念

图数据库组成结果
  • 节点 Nodes 图数据记录
    相似的节点可以有不同的属性
  • 关系 Relationships 连接节点
    关系总是有方向的
    关系总是有一种类型
    关系也是可以有属性的
  • 属性 Properties 命名数据值
    属性可以是字符串、数字或布尔值
  • 标签 Labels 关联一组节点
    节点可以没有或者有多个标签
    标签没有属性

图查询语言Cypher

  • 创建节点CREATE
CREATE (ee:Person {name:"Emil", from:"Sweden", klout:99})

CREATE 创建数据
() 括号表示一个节点
ee:Person ee表示节点的变量名,Person表示节点的标签
{} 花括号中添加节点的属性

  • 查找节点MATCH
MATCH (ee:Person) WHERE ee.name="Emil" RETURN ee

MATCH 查找节点或关系
(ee:Person) 标签为Person的节点,变量名为ee
WHERE 限定结果
ee.name="Emil" name属性为Emil
RETURN 返回结果

  • 创建更多节点和关系
MATCH (ee:Person) WHERE ee.name = "Emil"
CREATE (js:Person { name: "Johan", from: "Sweden", learn: "surfing" }),
(ir:Person { name: "Ian", from: "England", title: "author" }),
(rvb:Person { name: "Rik", from: "Belgium", pet: "Orval" }),
(ally:Person { name: "Allison", from: "California", hobby: "surfing" }),
(ee)-[:KNOWS {since: 2001}]->(js),(ee)-[:KNOWS {rating: 5}]->(ir),
(js)-[:KNOWS]->(ir),(js)-[:KNOWS]->(rvb),
(ir)-[:KNOWS]->(js),(ir)-[:KNOWS]->(ally),
(rvb)-[:KNOWS]->(ally)

避免创建重复数据MERGE

MERGE (mark:Person {name: 'Mark'})
RETURN mark

MATCH (j:Person {name: 'Jennifer'})
MATCH (m:Person {name: 'Mark'})
MERGE (j)-[r:IS_FRIENDS_WITH]->(m)
RETURN j, r, m
  • 查找Emil的朋友
MATCH (ee:Person)-[:KNOWS]-(friends)
WHERE ee.name = "Emil" RETURN ee, friends
  • 查找与Johan朋友的朋友中爱好是surfing的人
MATCH (js:Person)-[:KNOWS]-()-[:KNOWS]-(surfer)
WHERE js.name = "Johan" AND surfer.hobby = "surfing"
RETURN DISTINCT surfer

() 表示忽略的节点
DISTINCT 因为不止一个路径可以匹配该模式

  • 了解查询的工作方式PROFILE
PROFILE MATCH (js:Person)-[:KNOWS]-()-[:KNOWS]-(surfer)
WHERE js.name = "Johan" AND surfer.hobby = "surfing"
RETURN DISTINCT surfer
  • 删除节点和关系
match (n)-[r]-(n1) delete n,r,n1
match (n) detach delete n
  • 删除孤立节点
match (n) delete n

电影图

:play movie-graph

关系数据库--Neo4j

:play northwind-graph
  • 从外部CSV文件创建数据
LOAD CSV WITH HEADERS FROM  "xxx.csv" AS row
CREATE (n:Labeln)
SET n=row
n.xxx = toFloat(row.xxx)
n.yyy = toInteger(row.yyy)
n.bool = (row.bool<>'0')
  • 通过标签索引节点
CREATE INDEX ON :Labeln(LabelnID)
  • 将外键引用转换到数据关系
MATCH (p:Product),(c:Category)
WHERE p.categoryID = c.categoryID
CREATE (p)-[:PART_OF]->(c)
  • 将联接记录转换为关系

推荐阅读更多精彩内容