我正在尝试从Neo4j DB加载节点(大约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:
,因为每次我获得每个属性,这都是一次服务器之旅。正确?
完成此任务的最佳方法是什么?
答案 0 :(得分: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
结果包含我需要的信息,因此我只是遍历结果以获取属性。
需要注意的是,您需要编写查询,以便他们在第一时间获取您需要的信息。