查询图数据库方式
【图数据库笔记(NebulaGraph的基础查询)】使用官方提供的python client
测试用数据
上文提到的简单的网络拓扑结构数据
基本思想为,编写一个python类,传入参数后,返回指定参数、场景下的全部边和点数据,供前端使用
一、定义一个连接函数
def session(self):
self.connection_pool = ConnectionPool()
Graph_Config = Config()
Graph_Config.max_connection_pool_size = 3
try:
self.connection_pool.init([(config.NEBULA_HOST, config.NEBULA_PORT)], Graph_Config)
except Exception as e:
app.logger.error(e)self.client = None
try:
self.client = self.connection_pool.get_session(config.NEBULA_USER, config.NEBULA_PASS)
self.client.execute("USE {}".format(config.NEBULA_SPACE))
except:
if self.client is not None:
self.client.release()
- 官方给出的示例模板为使用了ConnectionPool,当链接数控制在一个时,可以直接实例Connection对象
def execute(self, sql=None):
sql = sql if sql else self.NgSQL
result = self.client.execute(sql)
return result
三、根据不同的应用场景,列举不同的查询
# 获取节点的vid信息,vid为节点数据存储在数据库中的唯一主键
self.NgSQL ="""MATCH (v: node{ip_str: "%s"}) RETURN id(v) as id""" % self.end_ip# 查询一个节点的上层节点
self.NgSQL = """MATCH p=(v: node{ip_str:"%s"})<-[e:next]-(v2) RETURN v2, relationships(p)""" % self.ip# 查询一个节点的下层节点
self.NgSQL = """MATCH p=(v: node{ip_str:'%s'})-[e:next]->(v2) RETURN v2 , relationships(p)""" % self.ip# 查询俩个节点之间的链路
self.NgSQL = """FIND SHORTEST PATH FROM {0} TO {1} OVER * UPTO 50 STEPS""".format(start_vid, target_vid)# 根据任务条件查询(上文声明了任务数据单独设置为一种节点,在建联任务与节点完成节点绑定任务数据。因此根据任务条件查询为任务下所有的建联节点)
self.NgSQL = """MATCH (v: taskid{task_id:%s})-->(v2) RETURN v2""" % self.task_id# 获取节点包含的所有信息
self.NgSQL = """MATCH (v2:node{ip_str: '%s'}) RETURN v2""" % self.ip# 获取层级数据(可以以任何节点为根节点进行层级数据查询)
self.NgSQL = """GET SUBGRAPH 4 STEPS FROM {} out next""".format(self.get_vid())
四、数据的解析
- 由于返回结果为自定义的ResulrSet类型数据,需要对返回值进行类型解析
@staticmethod
def print_resp(col):
valuehttps://www.it610.com/article/= ''
if col.is_empty():
valuehttps://www.it610.com/article/= ''
elif col.is_null():
valuehttps://www.it610.com/article/= 'None'
elif col.is_bool():
value = https://www.it610.com/article/col.as_bool()
elif col.is_int():
value = col.as_int()
elif col.is_double():
value = col.as_double()
elif col.is_string():
value = col.as_string()
elif col.is_time():
value = col.as_time()
elif col.is_list():
value = col.as_list()
elif col.is_set():
value = col.as_set()
elif col.is_map():
value = col.as_map()
elif col.is_vertex():
value = col.as_node()
elif col.is_edge():
value = col.as_relationship()
elif col.is_path():
value = col.as_path()
return value
最终根据解析后的数据组合成json类型数据,供前端使用。
具体的解析查询结果返回值示例为
# 解析边类型数据
def __parse_edge(self):
edge_list = []
for info in self.edge:
new_info = info.as_list()
if new_info:
for s_info in new_info:
new_data = https://www.it610.com/article/s_info.as_relationship()
start_id = self.print_resp(new_data.start_vertex_id())
end_id = self.print_resp(new_data.end_vertex_id())if start_id == end_id:
continue
edge_obj = new_data.propertys()
for k, v in edge_obj.items():
edge_obj[k] = self.print_resp(v)
virtual = edge_obj.get('virtual', False)
if virtual:
edge_obj['style'] = GraphStyle.edgeStyle
edge_obj['source'] = start_id
edge_obj['target'] = end_iddel edge_obj['virtual']
edge_list.append(edge_obj)
return edge_list
推荐阅读
- 技术分享 | 用图数据库来降低 MySQL 处理多层关系的延迟(一)
- 知识图谱|【JanusGraph入门】4-TinkerPop简介
- 图数据库|【JanusGraph入门】5-TinkerPop-家族