2014-10-30 25 views
2

我试图从一个Neo4j DB中加载节点(约400个)和关系(约800个)来创建一个使用D3的强制有向图。这是我的get函数(我使用的是龙卷风):使用py2neo从Neo4j中获取大量节点的最快方法

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

上述过程需要这么长时间的原因是因为每次我要求一个节点属性时,我都会去服务器去取出某些数据库。通过简单修改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 

结果包含我需要的信息,所以我只是通过循环的结果得到的属性。

外卖是你需要编写你的查询,让他们第一次得到你需要的信息。

相关问题