• neo4j


    neo4j图形数据库

    一、下载

    https://neo4j.com/download/     neo4j-community-3.5.12

    二、安装

    1.需要配置java环境

    2.配置neo4j系统变量  NEO4J_HOME -> C: eo4j eo4j-community-3.5.12

    3.配置neo4j环境变量 Path中添加%NEO4J_HOME%in

    4.验证是否安装成功

    C:Usersdaiszhan>neo4j.bat console
    2019-11-07 03:08:25.943+0000 INFO  ======== Neo4j 3.5.12 ========
    2019-11-07 03:08:25.991+0000 INFO  Starting...
    2019-11-07 03:08:30.949+0000 INFO  Bolt enabled on 127.0.0.1:7687.
    2019-11-07 03:08:33.013+0000 INFO  Started.
    2019-11-07 03:08:34.157+0000 INFO  Remote interface available at http://localhost:7474/

    5.通过访问http://localhost:7474   默认跳转到  http://localhost:7474/browser

    默认用户名和密码为:neo4j,需要改自己的密码eagleeye

    6.注册neo4j服务 C:Usersdaiszhan>neo4j install-service

    三、开启服务

    1.开启neo4j服务 C:Usersdaiszhan>neo4j start

    2.关闭neo4j服务 C:Usersdaiszhan>neo4j stop

    3.重启neo4j服务 C:Usersdaiszhan>neo4j restart

    5.查看neo4j状态 C:Usersdaiszhan>neo4j status

    四、安装python包

    pip install py2neo

    五、使用py2neo

    1.添加节点

    from py2neo import Node, Relationship, Graph, NodeMatcher, RelationshipMatcher
    
    ## 新建图形
    graph = Graph('http://localhost:7474', username='neo4j', password='eagleeye')
    
    ## 新建节点
    a = Node('label', name='a', id='0001', age=65, location='dalian')  #第一个参数是类别,第二个参数是名字,可以有很多个参数名字
    b = Node('label', name = 'b' )

    ## 给节点添加/修改属性
    a['age'] = 20
    ## 绘制节点 graph.create(a) graph.create(b) ## 新建关系 r1 = Relationship(a, 'to', b, protocol = 'tcp') #a是开始节点,b是终止起点,to是二者关系类型,protocol是其他属性,可以有很多个其他属性 graph.create(r1)

    ## 给关系添加修改属性
    r1['state'] = 'up'

    ## 输出节点, 关系
    print(a)
    (a:label {name='a',id='0001',age=65,lacation='dalian'})
    print(r1)
    (a)-[:to {protocol:"tcp"}]->(b)

    ## 对属性进行批量更新
    data={age:21,location:'shanghai'}
    a.update(data)

    2.对节点的操作

    ## 新建图形
    graph = Graph('http://localhost:7474', username='neo4j', password='eagleeye')
    
    ## 新建节点
    a = Node('label', name='a', id='0001', age=65, location='dalian')  
    
    # 返回节点的ID的哈希值
    hash(a)
    # 返回节点属性,没有就返回None
    a[age]
    # 设定节点属性值
    a['type'] = 'ccc'
    # 删除节点属性,没有会报KeyError
    del a['location']
    # 返回节点属性的数量
    len(a)
    # 返回节点所有属性
    dict(a)
    # 返回一个生成器且只包含一个节点
    walk(a)
    # 返回节点的标签的集合
    labels()
    # 判断是否有这个标签
    a.has_label(location)
    # 给节点添加标签
    a.add_label(test)
    # 删除节点标签
    a.remove_label(test)
    # 清除所有标签
    a.clear_labels()
    # 添加多个标签
    a.update_labels([test,test1])

    3.对连接的操作

    r1 = Relationship(a, 'to', b, protocol = 'tcp') #a是开始节点,b是终止起点,to是二者关系类型,protocol是其他属性,可以有很多个其他属性
    graph.create(r1)
    
    # 返回关系的hash值
    hash(r1)
    # 返回关系的属性值
    r1['state']
    # 设定关系的属性值
    r1['state']='up'
    # 删除关系的属性值
    del r1['state']
    # 返回关系的属性值数目
    len(r1)
    # 以字典形式返回关系的所有属性
    dict(r1)
    # 返回一个生成器包含起始节点,关系,终止节点 
    walk(r1)
    # 返回关系类型
    r1.type()

    4.子图

    from py2neo import Node, Relationship
    
    a = Node('Person', name='Alice')
    b = Node('Person', name='Bob')
    r = Relationship(a, 'KNOWS', b)
    s = a | b | r
    print(s)
    >>> ({(alice:Person {name:"Alice"}), (bob:Person {name:"Bob"})}, {(alice)-[:KNOWS]->(bob)})
    
    # 获取所有的节点
    s.nodes()
    # 获取所有的关系
    s.relationships()
    
    # 取交集
    s1=a|b|r
    s2=a|b
    print(s1&s2)
    >>> ({(alice:Person {name:"Alice"}), (bob:Person {name:"Bob"})}, {})
    
    print(s.keys())
    >>> frozenset({'name'})
    print(s.labels())
    >>> frozenset({'Person'})
    print(s.nodes())
    >>>frozenset({(alice:Person {name:"Alice"}), (bob:Person >>> >>> >>> {name:"Bob"})})
    print(s.relationships())
    >>> frozenset({(alice)-[:KNOWS]->(bob)})
    print(s.types())
    >>> frozenset({'KNOWS'})
    print(order(s))
    >>> 2
    print(size(s))
    >>> 1
    
    # 子图拥有的属性
    subgraph | other | … 子图的并
    subgraph & other & … 子图的交
    subgraph - other - … 子图的差
    subgraph ^ other ^ … 子图对称差
    subgraph.keys() 返回子图节点和关系所有属性的集合
    subgraph.labels() 返回节点label的集合
    subgraph.nodes() 返回所有节点的集合
    subgraph.relationships() 返回所有关系的集合
    subgraph.types() 返回所有关系的type的集合
    order(subgraph) 返回子图节点的数目
    size(subgraph) 返回子图关系的数目

    5.遍历

    from py2neo import Node, Relationship
    
    a = Node('Person', name='Alice')
    b = Node('Person', name='Bob')
    c = Node('Person', name='Mike')
    ab = Relationship(a, "KNOWS", b)
    ac = Relationship(a, "KNOWS", c)
    w = ab + Relationship(b, "LIKES", c) + ac
    print(w)
    >>> (alice)-[:KNOWS]->(bob)-[:LIKES]->(mike)<-[:KNOWS]-(alice)
    ## 用walk()方法实现遍历
    from py2neo import walk
    
    for item in walk(w):
        print(item)
    # 从 a 这个 Node 开始遍历,然后到 b,再到 c,最后重新回到 a
    >>> 
    (alice:Person {name:"Alice"})
    (alice)-[:KNOWS]->(bob)
    (bob:Person {name:"Bob"})
    (bob)-[:LIKES]->(mike)
    (mike:Person {name:"Mike"})
    (alice)-[:KNOWS]->(mike)
    (alice:Person {name:"Alice"})
    
    print(w.start_node())  #获取起始节点
    >>> (alice:Person {name:"Alice"})
    print(w.end_node())   #获取终止节点
    >>> (alice:Person {name:"Alice"})
    print(w.nodes())   #所有节点的元祖
    >>> ((alice:Person {name:"Alice"}), (bob:Person {name:"Bob"}), (mike:Person {name:"Mike"}), (alice:Person {name:"Alice"}))
    print(w.relationships())  #所有关系的元祖
    >>> ((alice)-[:KNOWS]->(bob), (bob)-[:LIKES]->(mike), (alice)-[:KNOWS]->(mike))

    6.查询

    6.1 传统方式

    graph = Graph()
    # 其中的数字对应的是节点,ID
    # 这个ID不按顺序来的,要注意
    graph.nodes[1234]
    graph.nodes.get(1234)

    6.2 match方式

    test_graph.data("MATCH (a:Person {name:'You'}) RETURN a")
    >>> [{'a': (c7d1cb9:Person {name:"You"})}]
    list(test_graph.run("MATCH (a:Person {name:'You'}) RETURN a"))
    >>>[('a': (c7d1cb9:Person {name:"You"}))]
    test_graph.run("MATCH (a:Person {name:'You'}) RETURN a").data()
    >>>[{'a': (c7d1cb9:Person {name:"You"})}]
    # 查询关系
    test_graph.run("MATCH (a:Person {name:'You'})-[b:FRIEND]->(c:Person {name:'Johan'}  )   RETURN a,b,c")
    # graph查询
    graph.run("MATCH (n:leafCategory) RETURN n LIMIT 25").data()  # list型
    graph.run("MATCH (n:leafCategory) RETURN n LIMIT 25").to_data_frame()  # dataframe型
    graph.run("MATCH (n:leafCategory) RETURN n LIMIT 25").to_table()  # table

    6.3 find方式

    # 节点个数
    len(graph.nodes)
    len(graph.nodes.match("leafCategory")) # 某类别的节点个数
    
    # 查找全部, 可根据label、property_key、property_value、limit查找
    graph=test_graph.find(label='Person')
    for node in graph:
        print(node)
    >>>
    (b54ad74:Person {age:18,name:"Johan"})
    (b1d7b9d:Person {name:"Rajesh"})
    (cf7fe65:Person {name:"Anna"})
    (d780197:Person {name:"Julia"})
    # 查找单节点, 可根据label、property_key、property_value查找
    test_graph.find_one(label='Person',property_key='name',property_value='You')
    >>> (c7d1cb9:Person {name:"You"})
    
    # 该节点是否存在
    test_graph.exists(graph.nodes[1234])

    6.4 NodeMatcher方式(py2neoV4适用)

    test_graph = Graph(password='123456')
    selector = NodeMatcher(test_graph)
    #selector = NodeSelector(test_graph)  适用py2neoV3
    list(selector.select("Person", name="Anna"))
    #筛选 age 为 21 的 Person Node
    list(selector.select("Person").where("_.name =~ 'J.*'", "1960 <= _.born < 1970"))
    #排序功能
    persons = list(selector.select('Person').order_by('_.age'))
    
    # 主要方法
    first()返回单个节点
    limit(amount)返回底部节点的限值条数
    skip(amount)返回顶部节点的限值条数
    order_by(*fields)排序
    where(*conditions, **properties)筛选条件

    6.5 match()或match_one()

    for rel in test_graph.match(start_node=node3, rel_type="FRIEND"):
        print(rel.end_node()["name"])
    >>>
    Johan
    Julia
    Andrew
    
    # match_one
    test_graph.match_one(start_node=node3, rel_type="FRIEND")
    >>> (c7d1cb9)-[:FRIEND]->(b54ad74)

    7.更新

    ## push的用法
    node = test_graph.find_one(label='Person')
    node['age'] = 18
    test_graph.push(node)
    print(test_graph.find_one(label='Person'))
    >>> (b54ad74:Person {age:18,name:"Johan"})
    
    ## update() 方法
    ## setdefault()方法
    ## 直接赋值法,会覆盖原有的

    8.删除

    delete(subgraph) 删除节点、关系或子图
    delete_all() 删除数据库所有的节点和关系
    
    from py2neo import Graph
    
    graph = Graph(password='123456')
    node = graph.find_one(label='Person')
    relationship = graph.match_one(rel_type='KNOWS')
    graph.delete(relationship)
    graph.delete(node)
    
    # 在删除 Node 时必须先删除其对应的 Relationship,否则无法删除 Node。

     参考文档 http://neo4j.com.cn/public/docs/index.html

  • 相关阅读:
    bzoj3687 简单题
    bzoj3992 [SDOI2015]序列统计
    bzoj4602 [Sdoi2016]齿轮
    bzoj4006 [JLOI2015]管道连接
    szoj461【四校联考0430】挑战
    bzoj4037 [HAOI2015]数字串拆分
    javascript 节点的增,删,改,查
    javascript 节点属性详解
    表单操作部分
    文档对象的操作
  • 原文地址:https://www.cnblogs.com/zz27zz/p/11811168.html
Copyright © 2020-2023  润新知