本文使用 Zhihu On VSCode 创作并发布
一、设置白名单
一定要是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
“p2是p1的spouse且p1的name属性是大狗哥,return符合条件p1、p2"
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 py2aliyungdb
py2aliyungdb是笔者自己写的代码,作用:创建数据,具体查找数据还是使用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)
使用py2aliyungdb导入数据建议:
- 最好还是对某些字段建立unique
// 设置label是d的id字段是唯一字段
CREATE CONSTRAINT ON (temp:d)
ASSERT temp.id IS UNIQUE
- 先建立节点
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)
- 再建立关系
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 总结
经过上面的学习,基本可以对阿里云图数据库
进行一些简单的操作。
四、常见问题
- 报TIMEOUT的错误
- 白名单
- 貌似体验版只能内网访问
- TypeError: '>' not supported between instances of 'NoneType' and 'int'
很神奇的错误,同样的代码,运行第一次报错,第二次成功。 - 设置唯一字段CREATE CONSTRAINT ON (cc:CreditCard)
ASSERT cc.number IS UNIQUE
五、参考资料
- Neo4j-创建节点之间的关系
- CQL
- python操作neo4j
- Neo4j python 官方API
- 阿里云图数据库
- Python操作Neo4j
- py2aliyungdb