date: 2024-07-01
title: Neo4j
status: DONE
author:
- AllenYGY
tags:
- NOTE
- Neo4j
- NoSQL
- Graph
publish: True
Neo4j
homebrew
包管理器进行安装)brew install neo4j
brew services start neo4j
cypher-shell
用户名 | 密码 |
---|---|
neo4j | neo4j |
:exit
brew services stop neo4j
Cypher 是一种声明式图形查询语言,可以对图形存储进行高效的查询和更新。
MATCH (node:Label) RETURN node
MATCH(node1:Label) -[:REL_TYPE]-> (node2:Label) RETURN node1, node2
MATCH(node1:Label) -[:REL_TYPE]-> (node2:Label) RETURN node1, node2
MATCH(node1:Label) -[REL:TYPE]-> (node2:Label) RETURN rel.property
CREATE(node: Label {key:value, ...})
CREATE (n:Person {name: 'Allen', age: 20})
MATCH (n:Label {key:value})
SET n.key = value
MATCH (n1:Label {key:value}), (n2:Label {key:value})
CREATE (n1)-[r:RELATIONSHIP]->(n2)
MATCH (n:Label {key:value})
REMOVE n.key
MATCH (n:Label {key:value})
DELETE n
MATCH (node {Property:Value})
DETACH DELETE node
MATCH (a:Label {Property: value})
OPTIONAL MATCH (a)-[r]-()
DELETE a, r
MATCH会返回空
OPTIONAL MATCH 即使没有匹配到也会返回 NULL
MATCH (person:Person)
RETURN person.name, person.born
ORDER BY person.born
MATCH (person:Person)
RETURN person.name, person.born
ORDER BY person.born DESC
MATCH (person:Person)
RETURN person.name, person.born
ORDER BY person.born ASC
MATCH (person:Person)
RETURN person.name, person.born
ORDER BY person.born DESC
SKIP 10 LIMIT 5
SKIP 10 LIMIT 5
MATCH (person:Person)
RETURN DISTINCT person.born
选中的节点与边组成的字符串
起点和终点都是节点
查找图中与Gene Hackman合作过的演员
MATCH (gene:Person)-[:ACTED_IN]->()<-[:ACTED_IN]-(other:Person)
WHERE gene.name="Gene Hackman"
RETURN distinct other
MATCH (actor:Person)-[:ACTED_IN]->(movie:Movie)<-[:DIRECTED]-(director:Person)
RETURN actor.name, movie.title, director.name;
MATCH (actor:Person)-[:ACTED_IN]->(movie:Movie),
(movie)<-[:DIRECTED]-(director:Person)
RETURN actor.name, movie.title, director.name;
MATCH (actor:Person)-[:ACTED_IN]->(movie:Movie),(director:Person)-[:DIRECTED]->(movie)
RETURN actor.name, movie.title, director.name;
跨越任何深度的关系是: (a)-[*]->(b)
特定深度关系的表示方法是:(a)-[*深度]->(b),以查找所有深度步长的路径。
1到4层深度的关系是这样表示的: (a)-[*1..4]->(b)
距离 3 层的 KNOWS 类型关系:(a)-[:KNOWS*3]->(b)
2 层 KNOWS 或 LIKES 类型的关系:(a)-[:KNOWS|:LIKES*2...]->(b)
MATCH p =(actor { name: 'Tom Hanks' })-[:ACTED_IN*2]-(co_actor)
RETURN relationships(p)
MATCH
(tom:Person { name: 'Tom Hanks' }),
(kevin:Person { name: 'Kevin Bacon' }),
p = shortestPath((tom)-[*..15]-(kevin))
RETURN p
Neo4j 不使用索引来加速 JOIN 操作
有助于通过值、前缀或范围查找起点
创建特定于标签的索引,因为索引绑定到具体的标签-属性组合上
示例:根据电影标题有效搜索
CREATE INDEX ON :Movie(title)
DROP INDEX ON :Movie(title)
CREATE INDEX ON :Person(name)
MATCH (person:Person)-[:ACTED_IN]->(movie:Movie)
RETURN person.name, collect(movie.title)
LOAD CSV WITH HEADERS
FROM "" AS line
CREATE (:Movie {id: line.id, title: line.title, released: toINT(line.year)})