安装py2neo_使用py2neo操作阿里云图数据库

本文使用 Zhihu On VSCode 创作并发布

一、设置白名单

e76fa7c60ec9cd77ba0db83db10f7f8c.png


一定要是0.0.0.0/0

二、跑一个简单的DEMO

from __future__ import print_function  # Python 2/3 compatibility
from gremlin_python.driver import client
client = client.Client('ws://host:port', 'g', username="username", password="password")
callback = client.submitAsync("g.V().limit(1)")
for result in callback.result():
    print(result)

三、操作阿里云图数据库

图数据库现在用的比较多的其实当属neo4j,所以还是希望直接用OpenCypher查询语言进行操作,同时最近也需要使用Neo4j做一些东西。
阿里云图数据库也是支持OpenCypher查询语言,并兼容bolt协议,可以通过Neo4j driver进行访问。
本来是想着用py2neo进行操作,但是阿里云图数据库建立不了Relationship,所以我自己先写了Node和Relationship的建立。
本章主要从:
neo4j的基本语句
使用python+neo4j操作阿里云图数据库

3.1 neo4j cypher语句

3.1.1 neo4j创建语句

CREATE (n1:Person {name:'大狗哥', born:1967})
CREATE (n2:Person {name:'二狗哥', born:1968})
CREATE (h1:Person {name:'小花姐', born:1965})
CREATE
(n1)-[:spouse]->(h1)

在Cypher中,关系分为三种:

  • 符号“--”,表示有关系,忽略关系的类型和方向;
  • 符号“-->”和“<--”,表示有方向的关系

3.1.2 neo4j查询语句

“p1是p2的spouse且p1的name属性是大狗哥,return符合条件p1、p2"match(p1:Person {name:'大狗哥'})-[:spouse]->(p2) return p1,p2

a851ecc1c4bd001d99375ba58f1d8733.png


“p2是p1的spouse且p1的name属性是大狗哥,return符合条件p1、p2"

dc7f561fde4cdbca30ac1edbf3a4151e.png

3.2 使用neo4j操作阿里云图数据库

from neo4j import GraphDatabase
driver = GraphDatabase.driver('bolt://{host:port}',
                                            auth=('{username}', '{password}'),
                                            encrypted=False)
def add_friend(tx, name, friend_name):
    tx.run("MERGE (a:Person {name: $name}) "
           "MERGE (a)-[:KNOWS]->(friend:Person {name: $friend_name})",
           name=name, friend_name=friend_name)

def print_friends(tx, name):
    for record in tx.run("MATCH (a:Person)-[:KNOWS]->(friend) WHERE a.name = $name "
                         "RETURN friend.name ORDER BY friend.name", name=name):
        print(record["friend.name"])

with driver.session() as session:
    session.write_transaction(add_friend, "Arthur", "Guinevere")
    session.write_transaction(add_friend, "Arthur", "Lancelot")
    session.write_transaction(add_friend, "Arthur", "Merlin")
    session.read_transaction(print_friends, "Arthur")

3.3 使用py2aliyungdb操作neo4j(添加Node、Relationship)

安装: pip install py2aliyungdbpy2aliyungdb是笔者自己写的代码,作用:创建数据,具体查找数据还是使用Py2neo

from py2neo import Node, Relationship, Graph, Path 
from py2neo.data import Node, Relationship
from py2neo.ogm import * 
from py2aliyungdb import Graph,Node,Relationship
from py2neo import NodeMatcher
from py2neo import Graph as neo2Graph

neo2Graph = neo2Graph('bolt://gds-bp13a03mg3fl53k30.graphdb.rds.aliyuncs.com:8182',                                                          
                  auth=('ynyn', 'yny456&ffjw1234'))
# neo2Graph.delete_all() 删除所有节点 慎用
g = Graph('bolt://gds-bp13a03mg3fl53k30.graphdb.rds.aliyuncs.com:8182',                                             
          auth=('ynyn', 'yny456&ffjw1234'))

g.connect()


# 增
_ = {
    'name':'c1',
    'id':1
}

n1 = Node('d', **_)
n2 = Node('d', name='c2', id=2)
n3 = Node('d', name='c3', id=3)
n4 = Node('d', name='c4', id=4)

g.create(n1)
g.create(n2)
g.create(n3)
g.create(n4)

r_1 = Relationship(n1, n2, 'r_1', is_exist_node=True)
r_2 = Relationship(n2, n3, 'r_2', is_exist_node=True)
r_3 = Relationship(n3, n4, 'r_3', is_exist_node=True)
r_4 = Relationship(n4, n1, 'r_4', is_exist_node=True)

g.create(r_1)
g.create(r_2)
g.create(r_3)
g.create(r_4)

# 查
g = neo2Graph
matcher = NodeMatcher(g)
print(list(matcher.match("d").where("_.name='c2'").limit(10)))

# 正则查找
print(list(matcher.match("d").where("_.name=~'c.*'").limit(10)))
# for i in matcher:
#     print(i)


from py2neo import RelationshipMatcher
r_matcher = RelationshipMatcher(g)
print(list(r_matcher.match(r_type='r_1').limit(2)))

# 改
n2 = matcher.match("d").where("_.id=2").first()
print(n2)
n2['name'] = 'c2_new'
g.push(n2)
n2 = matcher.match("d").where("_.id=2").first()
print(n2)

3efa9e91724fa7ddfce3c39ff539a309.png


使用py2aliyungdb导入数据建议:

  1. 最好还是对某些字段建立unique
// 设置label是d的id字段是唯一字段
CREATE CONSTRAINT ON (temp:d)  
ASSERT temp.id IS UNIQUE 
  1. 先建立节点
g = Graph('bolt://127.0.0.1:7687',auth=('neo4j', '1234'))
g.connect()
n1 = Node('d', name='c1', id=1)	# 创建Node
n2 = Node('d', name='c2', id=2)		# 创建Node
g.create(n1)	# 创建节点生效
g.create(n2)
  1. 再建立关系
g = Graph('bolt://127.0.0.1:7687',auth=('neo4j', '1234'))
g.connect()
# Relationship参数(node1: Node, node2: Node, relation: str, is_exist_node: bool, two_way=False)
# relation 关系(str)
# is_exist_node (Node是否已经创建了, True就不会重复创建了,而是在已有的节点上面建立连接)
# two_way(是否需要创建双向线路)
r_1 = Relationship(n1, n2, 'r_1', is_exist_node=True)	# 创建连线
g.create(r_1)	# 创建联系生效

希望各位大佬给这个JavanTang/**py2aliyungdb**点一个star

3.4 使用py2neo查询数据

上面的教程足够我们将数据导入到阿里云去,下一步就是匹配查找了,这里我们使用的是py2neo进行查找Node

from py2neo import NodeMatcher

g = neo2Graph('bolt://127.0.0.1:7687',auth=('neo4j', '1234')) 
matcher = NodeMatcher(g) 
print(list(matcher.match("d").where("_.name='c2'").limit(10)))  
print(list(matcher.match("d").where("_.name=~'c.*'").limit(10)))# 正则查找

py2neo进行查找Relationship

from py2neo import RelationshipMatcher 
r_matcher = RelationshipMatcher(g) 
print(list(r_matcher.match(r_type='r_1').limit(2)))

Output:

[r_1(Node('d', id=1, name='c1'), Node('d', id=2, name='c2')), r_1(Node('d', id=1, name='c1'), Node('d', id=2, name='c2'))]

3.5 总结

经过上面的学习,基本可以对阿里云图数据库进行一些简单的操作。

四、常见问题

  1. 报TIMEOUT的错误
    1. 白名单
    2. 貌似体验版只能内网访问
  1. TypeError: '>' not supported between instances of 'NoneType' and 'int'
    很神奇的错误,同样的代码,运行第一次报错,第二次成功。
  2. 设置唯一字段CREATE CONSTRAINT ON (cc:CreditCard)
    ASSERT cc.number IS UNIQUE

五、参考资料

  1. Neo4j-创建节点之间的关系
  2. CQL
  3. python操作neo4j
  4. Neo4j python 官方API
  5. 阿里云图数据库
  6. Python操作Neo4j
  7. py2aliyungdb
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值