使用py2neo从Neo4j快速获取大量节点的最佳方法

2 投票
1 回答
675 浏览
提问于 2025-04-30 16:14

我正在尝试从一个Neo4j数据库中加载大约400个节点和800个关系,以使用D3创建一个力导向图。这是我的获取数据的函数(我在用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:for r in results:这两行,因为每次我获取每个属性时,都会去一次服务器,对吧?

有什么好的方法可以完成这个任务吗?

暂无标签

1 个回答

1

上面这个过程之所以花了这么长时间,是因为每次我想要获取一个节点的属性时,都要去服务器上跑一趟,去数据库里取东西。通过简单地修改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

结果里包含了我需要的信息,所以我只需要遍历这些结果,就能获取到属性。

重点是,你需要写出能一次性获取到所需信息的查询。

撰写回答