【neo4j】Neo4j-Cypher、py2neo常用操作整理

这篇博客详细介绍了如何使用Cypher进行Neo4j数据库的操作,包括创建节点和关系、查询、修改、排序、导入CSV文件以及使用索引。同时,讲解了Python库Py2neo的使用,如连接数据库、创建和查询节点及关系、处理CSV数据等。此外,还提供了多个实用示例,涵盖了从基础操作到高级功能的各个方面。
摘要由CSDN通过智能技术生成

Cypher

文档链接: https://neo4j.com/docs/cypher-manual/4.3/.

1.创建
  • 创建结点
    create (n:teacher{name:“2”,id:”teacher1”}) return n
  • 创建关系
    MATCH (a:TEST),(b:TEST)
    WHERE a.name = ‘TEST-NAME’ AND b.name = ‘TEST-NAME1’
    CREATE (a)-[r:RELTYPE] -> (b)
    RETURN r
2.查询
  • 显示所有
    MATCH(n) RETURN n
  • 显示20个结点
    MATCH(n) RETURN n limit 20
  • 查询结点
    MATCH(n:User{name:“2”}) RETURN n
  • 查询关系
    match ()-[r:watch]->() return r
  • 根据属性查询结点
    match(n:course) where (n.marked=TRUE) return count(n)
  • 根据关系类型查询
    match(n)-[r]->(m) where type®=“teach” return n
  • 查询结点数量
    MATCH(n:User{name:“2”}) RETURN count(n)
  • 查询结点数量
    MATCH(n:User{name:“2”}) RETURN count(n)
  • 查询有关系的结点
    match(n) where ((n)-[]-()) return n
  • 查询没有关系的course结点
    match(n:course) where not ((n)-[]-()) return n
  • 查询与course没有关系的结点
    match(n) where not ((n)-[]-(p:course)) return n
  • 查询结点的所有标签、每个标签的节点数量
    MATCH (n) RETURN distinct labels(n), count(*)
  • 查询ID结尾是”数学”的结点
    match(n) where n.id ENDS WITH ‘数学’ return n
  • 查询ID开头是”数学”的结点
    match(n) where n.id START WITH ‘数学’ return n
    match(n) where n.id =~ ‘数学.*’ return n
  • 查询ID开头是”and”(不区分大小写)的结点
    match(n) where n.id =~ ‘(?!)数学.*’ return n
  • 查询ID结尾是”.com”的结点
    match(n) where n.id =~ ‘.*\.com’ return n
  • 查询ID包含”数学”的结点
    match(n) where n.id CONTAINS ‘数学’ return n
  • 查询含有属性name的结点
    match(n) where exists (n.name) return n
  • 查询A类型或B类型的关系
    match()->[r:A|:B]->() return r
  • 查找结点之间的所有最短路径
    match(n),(m),p=allShortestPaths((n)-[*]-(m))
  • 查找结点之间的最短路径,路径最大长度为10
    match(n),(m),p=shortestPath((n)-[*…10]-(m)) return p
  • 查找结点的1~3跳关系(有点不确定,慎用)
    match(n)-[r:SHIP*1…3]-(m)
  • 查询并显示多个关系
    MATCH p=()-[r:prerequisite]->(),q=()-[wr:taught]->() RETURN p,q
3.修改

Delete用于删除图元素(节点、关系、或路径),若要也删除与之相连的关系则用detach delete。
remove 语句用于删除图元素的属性和标签。

  • 清空数据库
    match (n) detach delete n
  • 添加结点的属性(若结点不存在会新建结点)
    MERGE (n:Course) ON MATCH SET n.name=”yang”
  • 删除节点及其相关关系
    match (n:teacher) detach delete n
  • 删除结点属性
    match (n {name: “huzong”}) remove n.age
  • 删除结点标签
    match (n {name “huzong”}) remove n:teacher
  • 删除结点多个标签
    match (n {name “huzong”}) remove n:teacher:user
  • 删除结点/关系
    MATCH (n:User) -[r:study]-(p:Course{name:“f”}) DELETE n,r,p
  • 设置与course结点有关的路径上的结点的属性
    MATCH p = (t:course)-[r]-(A) FOREACH (n in nodes§| SET n.marked = TRUE )
4.排序 ORDER BY

Order by 是紧跟RETURN或者WITH的子句。

  • 根据属性对节点进行排序
    MATCH (n) RETURN n.name ORDER BY n.name,n.id
  • 节点降序排列
    MATCH (n) RETURN n.name ORDER BY n.name DESC
5.导入csv文件(load csv)

比admin慢,比py2neo快。

  • LOAD CSV FROM “file:///entities/teacher.csv” AS row 后续用row[0]、row[1]来读取相应信息,若文件有头行,则用row.id和row.name来读取对应的属性值。此处是绝对路径,文件要放在import目录下。
    在这里插入图片描述
  • 若csv文件很大,则用USING PERIODIC COMMIT LOAD CSV FROM “file:///entities/teacher.csv” AS row
6.索引
  • 创建索引
    create index on:Student(name)
  • 删除索引
    drop index on:Student(name)
  • 创建唯一索引
    create constraint on (s:Teacher) assert s.name is unique
  • 删除唯一索引
    drop constraint on (s:Teacher) assert s.name is unique

py2neo

1.连接数据库
from py2neo import *
from py2neo.matching import *
test_graph = Graph(         # 连接Neo4j,test_graph为自己命名的,后面调用都要使用这个test_graph
    "http://localhost:7474",
    auth=("neo4j", "neo4j")    #前为用户名,后为密码
)

其他可能用到的头文件:

from py2neo.bulk import create_nodes
from py2neo.bulk import merge_nodes
from py2neo.bulk import create_relationships
2.创建节点
a = Node("Person", name="Alice")    # 前为标签,name为属性
b = Node("Person", name="Bob")
test_graph.create(a)     #放入数据库
test_graph.create(b)
a.add_label("Employee")     # 添加标签,a的标签变为{'Employee', 'Person'}
print(set(a.labels))       # a结点标签的set集合
a.remove_label("Employee")     # 删除标签
print(a.has_label("Person"))    # a若有标签Person则返回True
a.clear_labels()          # 删除该结点的所有标签

其他:
node[name] 返回名为name的属性的值。
node[name] = value 将名为name的属性的值设置为value。
del node[name] 从此节点中删除名为name的属性。len(node) 返回此节点上的属性数。
dict(node) 返回此节点中所有属性的字典。
clear( ) 从此节点中删除所有属性。
values( ) 返回所有属性值的列表。
get(名称,默认=无) 返回名为name的属性的值。

3.创建关系
ab = Relationship(a, 'CALL', b)    # 关系的类型为"CALL",两条关系都有属性count,且值为1
ab['count'] = 1        # 设置关系的值
KNOWS = Relationship.type("KNOWS")         # 另一种表示的关系建立
ba = KNOWS(b, a)
test_graph.create(ab)
test_graph.create(ba)
ab['count'] += 1              # 节点/关系的属性赋值
test_graph.push(ab)           # 属性值的更新
print(ba.nodes)    # 打印nodes 开始节点和结束节点的 2 元组。ba.end_node表示结束结点。ba.start_node表示开始结点。

其他:
del ba[‘count’] 删除属性。
clear( )在此关系中删除所有属性。

4.查询节点
nodes = NodeMatcher(test_graph)   # NodeMatcher节点匹配
keanu = nodes.match("Person", name="Keanu Reeves").first()  # 对于标签和属性的简单相等匹配
print(keanu)
nodes.match("Person", name=STARTS_WITH("John")).all()  # 匹配名称以“John”开头的所有节点,
nodes.match("Person", born=ALL(GE(1964), LE(1966))).all()   # 匹配出生于 1964 年至 1966 年(含)的所有人
nodeList = list(nodes.match().where("_.name=~‘杨.*’"))    # 查找名字以“杨”开头的所有节点
for i in nodeList:
    print(i)
nodeList = list(nodes.match().where("_.name=~‘杨.*’")).order_by("_.name").limit(4)   # 加上“排序”“限制返回条数”

其他:
IS_NULL( ),IS_NOT_NULL( ) 空检查谓词。
EQ(值),NE(值)。排序谓词LT(值),LE(值),GT(值),GE(值) 相等谓词。

5.查询关系
relation_matcher = RelationshipMatcher(test_graph)
re = relation_matcher.match((a,), r_type="KNOWS").first()
print(re)
reList = list(relation_matcher.match())     #查询所有关系
6.路径
abc = Path(a, "CALL", b, Relationship(c, "KNOWS", b), c)
print(abc.nodes)
print(abc.relationships)
d, e = Node(name="Dave"), Node(name="Eve")
de = Path(d, "KNOWS", e)
abcde = Path(abc, "KNOWS", de)     # 两个Path构成一个Path
for relationship in abcde.relationships:   # 遍历Path上的关系
    print(relationship)

其他:
types( ) 返回此路径上存在的所有关系类型的集合。
start_node。end_node。

7.子图Subgraph

子图是节点和关系的任意集合。一个子图必须至少包含一个节点,空子图应由None表示。

friends = ab | ba  # 并集
test_graph.create(friends)
print(friends)

其他:
keys( )。labels( )。nodes。relationships。types( )。
subgraph | other | …:并集。
subgraph & other & …:交集。
subgraph - other - …:减。
subgraph ^ other ^ …:返回一个新的子图,该子图包含的节点和关系只出现在subgraph中或者other中,通过关系相连的节点也包含在新子图中,不管这些节点是否存在于subgraph或者other中。

8.调用cypher内部方法

可以利用run 方法来直接执行Cypher语句,返回的是游标cursors,cursors必须通过遍历来展示结果。

match_str = "match p=shortestPath((m:m的label{name:'m的name属性值'})-[r*1..4]-(n:n的label{name:'name属性值'})) return p"
p1 = test_graph.run(match_str)
for p in p1:
    print(p)
9.导入csv文件并进行处理
import csv
with open('F:/neo4j/data/MOOCCube/subject/计算机科学技术.csv', 'r', encoding='UTF-8') as f:
    next(f)   # 如果文件有头行,可以让文件从第二行开始读取
    reader = csv.reader(f)
    for item in reader:
        # print("当前行数:", reader.line_num, "当前内容:", item)
        a = Node("Course", name=item[1], ID=item[0], subject='计算机科学技术')
        g.create(a)

Neo4j数据库连接

在cmd命令行里输入neo4j.bat console,加载完后在浏览器中打开网页http://localhost:7474/即可使用。
在这里插入图片描述

其他小用法

1.neo4j–Cypher语法练习(WITH、 FOREACH、Aggregation、UNWIND、UNION、CALL):
链接: https://blog.csdn.net/qq_37503890/article/details/101565515?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2defaultCTRLISTdefault-1.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2defaultCTRLISTdefault-1.no_search_link
2.Py2neo部分对node、relations、subgraph的小用法:
链接: https://blog.csdn.net/claroja/article/details/84287093
3.官方文档中一些方法的运用:
链接: https://blog.csdn.net/Elenstone/article/details/106452464

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值