[英]Neo4J query poor performance
我正在使用NEO4J数据库执行“压力测试”。 没什么大不了的,但是部分结果使我怀疑这种技术是否适合在线应用程序(或者我根本不了解Cypher)。
第一个测试是像
(1° node) -[:NEXT_FRAME]-> () -[:NEXT_FRAME]-> () -[:NEXT_FRAME]-> () -[:NEXT_FRAME]-> ... -[:NEXT_FRAME]-> (last node)
然后使用此查询检索整个路径
START n=node:Frame(node_id="0"), m=node:Frame(node_id="9000")
MATCH p=(n)-[:FRAME_NEXT*]->(m)
RETURN p
ORDER BY m.node_id DESC
LIMIT 1
注意,当m.node_id == 2
,查询大约需要100毫秒。 现在有约9000个节点,最多可能需要30秒。 我不是专家,但是时间太多了! 我认为9K节点不会产生太大的变化。
那么,我想念什么?
干杯(和圣诞快乐)
编辑:
我正在使用py2neo并以这种方式计时查询:
q_str = """
START n=node:Frame(node_id="0"), m=node:Frame(node_id="%d")
MATCH p=(n)-[:FRAME_NEXT*]->(m)
RETURN p
ORDER BY m.node_id DESC
LIMIT 1
""" % (i,)
print q_str
before = datetime.datetime.now()
query = neo4j.CypherQuery(graph_db, q_str)
record, = query.execute().data
after = datetime.datetime.now()
diff = after - before
diff_ms = diff.total_seconds() *1000
print 'Query took %.2f ms' % (diff_ms)
这是Cypher的缺点,目前无法很好地处理较长的可变长度路径。
您可以尝试MATCH p=shortestPath((n)-[:FRAME_NEXT*]->(m))
吗?
另外,如果可以,您是否可以尝试Neo4j 2.0,而不是使用标签和新索引来使用旧索引。 根据查询计划,应该使用更快的双向遍历匹配器。
MATCH (n: Frame {node_id:"0"})-[:FRAME_NEXT*]->(m:Frame {node_id:"9000"})
RETURN p
另外,使用REST遍历器可能会更好: http : //docs.neo4j.org/chunked/milestone/rest-api-traverse.html
或REST-graph-algo: http : //docs.neo4j.org/chunked/milestone/rest-api-graph-algos.html
如果只有一条路径,则可以删除ODER BY
和LIMIT
。 另外,尝试使用shortestPath
函数,即使您的图形中只有一条匹配的路径(即,即使所有路径都是最短的),它也可以更快。 最后,如果您知道可变深度关系的深度,请在您的模式中声明该深度,并且如果您仅大致知道深度,则指定一个范围。 尝试将这些组合进行比较,您可以在neo4j-shell中对其进行概要分析,并查看执行计划。
MATCH p=(n)-[:FRAME_NEXT*9000]->(m)
MATCH p=(n)-[:FRAME_NEXT*8900..9100]->(m)
MATCH p=shortestPath( (n)-[:FRAME_NEXT*]->(m) )
MATCH p=shortestPath( (n)-[:FRAME_NEXT*8900..9100]->(m) )
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.