neo4j语句积累
Neo4j是一个高性能的、NOSQL(非关系型)的图形数据库。它将结构化数据存储在网络上而不是表中,是目前最流行的图形数据库之一。
Neo4j的主要特点包括:
- 图形模型:Neo4j使用图形模型来表示和存储数据,这使得它非常适合表示复杂的关系网络。
- 高性能:由于其图形结构,Neo4j可以在处理复杂的关系查询时提供出色的性能。
- 灵活性:Neo4j支持ACID事务,支持通过Cypher查询语言进行数据查询,也支持通过RESTful API和各种语言的驱动程序进行访问。
- 扩展性:Neo4j可以在多台机器上分布运行,以提供更大的存储容量和更高的处理能力。
- 开源:Neo4j是开源的,这意味着你可以免费使用和修改它,而且有一个活跃的社区提供支持和开发新功能。
Neo4j常常用于社交网络、推荐系统、路径规划、网络分析等多种场景,可以有效处理大量复杂的关系数据。
安装:
curl -O http://dist.neo4j.org/neo4j-community-3.4.5-unix.tar.gz
tar -zxvf neo4j-community-3.4.5-unix.tar.gz
cd neo4j-community-3.4.5/
启动
bin/neo4j start
停止
bin/neo4j stop
几种导入数据方法:
少量数据,创建节点和关系
from py2neo import Graph, Node, Relationship
class NEODB():
def __init__(self):
self.graph = Graph("http://***:7474", auth=("***", "***"))
self.label = "**"
def merge_node(self, parent, child):
# 创建或获取节点
node1 = Node(self.label, name=parent)
self.graph.merge(node1, self.label, "name")
# 创建或获取节点
node2 = Node(self.label, name=child)
self.graph.merge(node2, self.label, "name")
# 创建或获取关系
rel = Relationship(node1, "HAS_CHILD", node2)
self.graph.merge(rel, self.label, "name")
万级数据,使用LOAD CSV
生成节点和关系demo.csv
parent | child |
---|---|
生活、艺术与文化 | 生活 |
生活、艺术与文化 | 收藏 |
激活shell
./bin/cypher-shell
执行命令
USING PERIODIC COMMIT 100 LOAD CSV WITH HEADERS FROM 'file:///neo4j-community-3.4.5/import/demo.csv' AS line MERGE (p:cnwk {name: line.parent}) MERGE (c:cnwk {name: line.child}) MERGE (p)-[:HAS_CHILD]->(c);
百万级数据,使用neo4j-admin import
生成节点node.csv和关系rels.csv(因为没有merge命令可以用,所以node在生成csv时就去重)
:ID | name | :LABEL |
---|---|---|
1 | 生活、艺术与文化 | cnwk |
2 | 生活 | cnwk |
:start_id | :end_id | :type |
---|---|---|
1 | 2 | HAS_CHILD |
执行命令
./neo4j-admin import --database=demo --nodes=../import/node.csv --relationships=../import/rels.csv
常用sql:
删除整个label
MATCH (n:cnwk) DETACH DELETE n
查询 / limit
MATCH (n:cnwk) RETURN n LIMIT 25
查询
MATCH (root:cnwk {name: 'cnwkdataset'})-[:HAS_CHILD]->(level1)-[:HAS_CHILD]->(level2) RETURN root, level1, level2
查询 / 有关系的前三层
MATCH (n:enwk {name:"wkdataset"})-[:HAS_CHILD*..3]->(c) RETURN DISTINCT c
知道某个子节点,向上查找链
MATCH (b:cnwk {name: "篮球"})<-[:HAS_CHILD*]-(parents: cnwk) RETURN parents
知道某个节点,向上查找30层HAS_PARENT关系,limit 50,同时排序
MATCH path = (child:cnwk {name:"篮球"})-[:HAS_PARENT*..30]->(parent:cnwk {name:"cnwkdataset"}) with path limit 50 WITH path ORDER BY length(path) ASC with [node in nodes(path) | node.name] AS nodelist return nodelist