neo4j 是一种图数据库,图数据库着重于数据之间的关系,而非数据本身的信息。一个 RDBMS 被优化用于聚合数据。而 neo4j 擅长于高度关联的数据。 优点是插入查询方便,搜索便利方法方便。缺点是超大节点的操作慢。
neo4j 模型建立
neo4j 中的概念: 节点,关系,属性,标签(针对节点),类型(针对关系)
属性:重要的数据结构,不同于关系数据库模型的特征。节点和关系可以具有任意数量的属性,重要的key/value 。
用标签可以扩展属性组,用于将节点划分到特定集合。
模型中的元素可以是显式和隐式(是否直接作为节点),也可以是不变或者可变的。
neo4j 开发
- 通过核心 Java API(系统级)
- 通过查询语言 Cypher(易读,结构强大)
-
查找起始节点
START user = node(1) -
跟随关系遍历图形
MATCH (user)-r: HAS_SEEN-(movie) -
返回最终节点。
RETURN movie
-
Cypher 基本句法
- start - 查找图形中的起始节点
- match - 匹配图形模式,可以定位子图形
- where - 基于某种标准过滤数据
- return - 返回感兴趣的结果
- 模式匹配
- 节点和关系连接
- 两个关系链接三个节点
-
多个模式同时匹配
- 查找节点
- 通过id
- 通过INDEX START john = n: User(name: “”)
- 查询多个起始节点 START john = n: User(name: “”), jack = n: User(name: “”)
- 分页结果: ORDER 结果排序 SKIP 进行分页 LIMIT 限定输出数量
-
过滤数据 可以通过正则表达式过滤 WHERE friend.mail = /@gmail.com/
- 返回结果 返回属性,关系,路径以及分页结果
- ORDER 排序
- SKIP 跳到指定的页
- LIMIT 限制输出数量
- 更新节点数据
建立新节点和查找已有节点 CREATE语句 设置节点对应的关系
CREATE
(
-
删除数据 DELETE 注意选择删除节点,关系
-
更新节点和关系属性 SET john.yob = 1973
8.删除属性 start n= john delete n.name
高级 Cypher
- 数据聚合
非聚合条目(节点),聚合函数(COUNT)
- Cypher函数, p = (n)->r: IS_FRIEND_OF*1..3-()
NODES(path)
HAS(Entity.propertyName)
ALL(), NONE(), SINGLE()
- 链式查询一个查询的输出链接到另一个查询 MATCH n-r-() with TYPE(r) as TYPE, count(*) AS COUNT where COUNT >1
命名with 语句中的输出字段是强制性的。
- shortestpath
- allshortestpaths extract( x in collection | expression ) 例如:
其他
-
从 CSV 文件导入到 Neo4j
LOAD CSV WITH HEADER FROM "url" AS row MERGE (src:Character {name: row.Source}) MERGE (tgt:Character {name: row.Target}) MERGE (src)-[r:INTERACTS]->(tgt) SET r.weight = toInt(row.Weight)
-
一次显示多个点 MATCH (n:uid) WHERE n.name IN [‘724972’,’704332’,’724747’] RETURN \3.
Tips
- 首次登陆必须修改密码,否则无法使用
- neo4j 默认只能从本机访问,如果需要从外网访问,修改配置文件即可。
- 网页控制台(基于网页的接口)
- 添加 APOC 时,需要将jar文件放在default.graphdb下的plugins,重启即可。
- 步长为2的路径 ()-[*2]-()
- match (a)-[*2]->(b) where a.name=‘Kaine‘ and not (a)-[*1]->(b) return a,b
- ()-[*..2]-() 步长不超过2
- $match (n) where EXISTS(n.is_black) return n limit 5 查看属性是否存在
MAX DESC
新建一个node,包括变量名和label,并添加属性。
可以做以下尝试:
使用Match和属性查找一个节点。
使用Match和关系查找相关节点。
使用Match进行推荐。
使用Match寻找最多4跳以内的节点。
使用Match寻找两节点之间的最短路径。
https://github.com/linonetwo/neo4j-tutorial-Chinese/blob/master/Chapters/1.md
http://www.infoq.com/cn/articles/graph-nosql-neo4j
refrences:
- http://www.blogs8.cn/posts/AtIte8c
- http://neo4j.com/docs/developer-manual/current/cypher/syntax/patterns/