【问题标题】:Neo4j - Indexes and performanceNeo4j - 索引和性能
【发布时间】:2015-04-10 15:09:15
【问题描述】:

我对 Neo4j 中 Cypher 查询的性能有疑问。 情况是:我的图表的每个节点都有一个属性,我想计算具有相同属性的节点数。 所以,我的基本查询是

match (n:NodeLabel)
with n.community as community, n.myid as myid
match (m) where m.community = community
return myid, count(m) as totcommunity

我在属性“社区”上创建了一个索引

create index on :NodeLabel(Community)

但是性能很差:200.000 个节点的图需要很长时间。 如何获得更好的性能?

提前致谢

【问题讨论】:

    标签: indexing neo4j cypher database-indexes


    【解决方案1】:

    您忘记为第二个匹配添加标签,然后它无法使用索引: 试试这个:

    match (n:NodeLabel)
    match (m:NodeLabel) where m.community = n.community
    return n.myid as myid, count(*) as totcommunity
    

    您还可以通过在查询前加上 EXPLAIN 并检查查询计划来确保它使用索引。

    【讨论】:

    • 感谢 EXPLAIN 子句(我不知道)。但是,如果我有不同的节点标签并且我想检查所有节点的社区属性怎么办?你是在告诉我,如果我不为节点指定标签,它就不会使用指定属性的索引?
    • 我不明白如何使用 EXPLAIN 子句。你能举个例子吗?非常感谢
    【解决方案2】:

    如果要返回每个不同的社区值以及具有该值的节点数:

    MATCH (n:NodeLabel)
    RETURN n.community, COUNT(n);
    

    如果您想要获取与特定节点具有相同community 值的节点数(如我的myid 标识),请尝试以下查询:

    MATCH (n:NodeLabel {myid: 123})
    WITH n.community AS c, n.myid AS myid
    MATCH (n:NodeLabel)
    WHERE n.community = c
    RETURN myid, n.community, COUNT(n);
    

    【讨论】:

    • 感谢您的回答。是的,它应该工作。但我希望特定节点的大小是它们所属社区的大小,而不是所有社区的大小。
    • 是的。但问题在于在匹配节点时使用所需的标签。非常感谢您的回答
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-07
    • 2014-05-30
    • 2015-03-13
    • 2011-06-29
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多