雪重 Python Developer 知识 汗水 灵感 机遇
2023年9月16日   sql neo4j

neo4j语句积累

Neo4j是一个高性能的、NOSQL(非关系型)的图形数据库。它将结构化数据存储在网络上而不是表中,是目前最流行的图形数据库之一。

Neo4j的主要特点包括:

  1. 图形模型:Neo4j使用图形模型来表示和存储数据,这使得它非常适合表示复杂的关系网络。
  2. 高性能:由于其图形结构,Neo4j可以在处理复杂的关系查询时提供出色的性能。
  3. 灵活性:Neo4j支持ACID事务,支持通过Cypher查询语言进行数据查询,也支持通过RESTful API和各种语言的驱动程序进行访问。
  4. 扩展性:Neo4j可以在多台机器上分布运行,以提供更大的存储容量和更高的处理能力。
  5. 开源: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