【问题标题】:Fastest way to get a large number of nodes from Neo4j using py2neo使用 py2neo 从 Neo4j 获取大量节点的最快方法
【发布时间】:2014-10-30 16:45:14
【问题描述】:

我正在尝试从 Neo4j 数据库加载节点(大约 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:for r in results:,因为每次我获得每个属性时,都是一次服务器之旅。对吧?

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

【问题讨论】:

    标签: python neo4j py2neo


    【解决方案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
    

    结果包含我需要的信息,所以我只是循环遍历结果以获取属性。

    要点是您需要编写查询,以便它们在第一时间为您提供所需的信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多