繁体   English   中英

Neo4J查询性能不佳

[英]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)

该查询尝试标识nm之间的每条路径,根据图形的形状,这可能是一个很大的数字。

在这种情况下,请尽量避免使用ORDER BY 由于仅需要标识一个路径,因此以下操作可能会更快:

START n=node:Frame(node_id="0"), m=node:Frame(node_id="9000")
MATCH p=(n)-[:FRAME_NEXT*]->(m)
RETURN p
LIMIT 1

如果您正在寻找纯粹的性能,那么直接使用遍历API图形算法会更好。 这需要一些Java编码。

这是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 BYLIMIT 另外,尝试使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM