使用py2n从Neo4j获取大量节点的最快方法

2024-05-05 23:49:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试从neo4jdb加载节点(大约400个)和关系(大约800个),以使用D3创建一个有力导向图。这是我的get函数(我使用的是Tornado):

def get(self):
        query_string = "START r=rel(*) RETURN r"
        query = neo4j.CypherQuery(graph_db, query_string)
        results = query.execute().data
        start = set([r[0].start_node for r in results])
        end = set([r[0].end_node for r in results])
        nodes_to_keep = list(start.union(end))
        nodes = []
        for n in nodes_to_keep:
            nodes.append({
                "name":n['name'].encode('utf-8'), 
                "group":n['type'].encode('utf-8'), 
                "description":n['description'].encode('utf-8'), 
                "node":int(n['node_id'])})
        #links
        links = []
        for r in results:
            links.append({"source":int(r[0].start_node['node_id']), "target":int(r[0].end_node['node_id'])})
        self.render(
            "index.html",
            page_title='My Page',
            page_heading='Sweet D3 Force Diagram',
            nodes=nodes,
            links =links,
        )

我认为昂贵的进程在for n in nodes_to_keep:和{}中,因为每次我得到每个属性,都是到服务器的一次旅行。正确的?在

完成这项任务的最佳方法是什么?在


Tags: toinidnodeforlinksquerystart
1条回答
网友
1楼 · 发布于 2024-05-05 23:49:17

上面的过程花费这么长的时间是因为每次我请求一个节点属性时,我都要到服务器上从数据库中取出一些东西。通过简单地修改Cypher查询,我可以大大减少这个过程所花费的时间。在

例如,要获取具有关系的所有节点,我使用以下查询:

query_string = """MATCH (n)-[r]-(m) 
                RETURN n, n.node_id, n.name, n.type, n.description, m.node_id, m.name, m.type, m.description""" 
query = neo4j.CypherQuery(graph_db, query_string)
results = query.execute().data

结果包含了我需要的信息,所以我只需遍历结果来获得属性。在

要点是你需要写下你的查询,这样他们就可以在第一时间得到你需要的信息。在

相关问题 更多 >