python 查询neo4j图数据库返回path,对path数据做解析

背景:需要对neo4j 查询结果,这里返回的是path做解析,返回json给前端,前端展示到页面,类似neo4j浏览器方式。

给出一个实体标签,及实体name,查询与该节点有一度关系的节点m,并且限制m的条数。

分析

  1.需要查询一度关系

  2.限制返回条数

  3.返回结果如何将path解析为json数据,方便前端展示

   

  cql: MATCH path =(n:`{en_label}`)--(m) WHERE n.{name}='{en_name}' with m.type as mtype,collect(path)[..{limit}] as paths return paths;

  使用占位符

    {en_label}:实体标签,如: 地点

    {en_name}:实体name,如:北京

    {limit}:m的条数

      with……这块是按 m.type(我这里定义的type就是m的实体标签),分组,然后每一组返回m条数据,比如 地点与公司和保险有关系,那公司和保险实体各返回m条path.

  解析path    # path=[[A-[r1]->B],[A-[r2]->C]]

data_array = []

for item in data:
    path_array = []
    for p in paths:
        startnode = {"properties": p.start_node, "identity": p.start_node.identity,"label": str(p.start_node['type'])}
     endnode = {"properties":p.end_node, "identity": p.end_node.identity,"label": str(p.end_node['type'])}
     relation = p.relationships[0]  
     rel = {"properties": relation, "startnode": relation.start_node.identity,"endnode": relation.end_node.identity}
     path_array.append({"start": startnode, "end": endnode, "relationship": rel})      
    data_array.extend(path_array)

返回结果

data_array:[{"start":{"properties":节点的属性,"identity":节点的唯一标识,"label":节点标签},"end":{"properties":节点的属性,"identity":节点的唯一标识,"label":节点标签},

        ,"relationship":{"properties":关系的属性,"startnode":关系的开始节点与identity 对应,来判断关系的方向,start和end本身不代表方向,"endnode":关系的结束节点,与identity对应与identity },

        {"start":{"properties":节点的属性,"identity":节点的唯一标识,"label":节点标签},"end":{"properties":节点的属性,"identity":节点的唯一标识,"label":节点标签},

        ,"relationship":{"properties":关系的属性,"startnode":关系的开始节点与identity 对应,来判断关系的方向,start和end本身不代表方向,"endnode":关系的结束节点,与identity对应与identity }]

如果是path=[[A-[r1]->B-[r2]->C],[A1-[r1]->B1-[r2]->C1]] 这种形式的会解析成[[{A,B,r1},{B,C,r2}],[{A1,B1,r1},{B1,C1,r2}]] 方便前端解析,这也是参考了neo4j浏览器端展示方式。

遇到的问题:解析path过程中,如果我打印path中的数据,最后序列化之后返回数据不为空, 如果不打印或者不使用path数据,返回数据为空,这个问题困扰了许久,后来发现neo4j数据库也有懒加载情况,可能是因为底层是java开发的,

所以我在这里正好使用了  "label": str(p.start_node['type']),代表我使用了path中的数据,所以返回结果是有数据的。

原文地址:https://www.cnblogs.com/liangxinxinbo/p/13402717.html