【问题标题】:Neo4j Index created by constraint约束创建的 Neo4j 索引
【发布时间】:2015-04-09 17:07:41
【问题描述】:

我仍在尝试解决我的速度问题(此处显示:Cypher MATCH query speed)。

我注意到的一件事是,当我导入具有唯一约束的数据时(由以下证明)。

neo4j-sh (?)$ 在 :Person(username) 上创建索引;

QueryExecutionKernelException:标签“人员”和属性“用户名” 对它们定义了唯一约束,因此索引已经 已创建与此匹配。

当我尝试在 shell 中查看索引时,我得到以下信息:

neo4j-sh (?)$ 索引 --indexes
节点索引:

关系索引:

自动生成的索引不应该显示吗?如何验证唯一约束实际上是在索引用户名?

主要问题(如上面的链接所示)是下面的简单查询需要 36 秒(急切调用),而切换到非急切调用需要两倍的时间。

USING PERIODIC COMMIT 15000
LOAD CSV WITH HEADERS FROM "file:d:/messages.csv" AS line
MATCH (a:Geotagged { username: line.sender }) - [r:MSGED] -> (b:Geotagged { username: line.recipient })
RETURN NULL;

注意,这不包括我最初尝试使用的 SET 调用,我删除了它,仅 MATCH 就永远占用了。

此外,我还将页面缓存增加到了我应该需要的几倍,并且没有看到任何变化。

编辑 1 标有“地理标记”的节点也标记为“人员”。所有节点都是“人”,有些节点恰好也被“地理标记”。

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    您是否对 Geotagged 标签和 Person 标签使用了唯一性约束?我发现两个标签上的唯一性约束大大提高了速度。

    【讨论】:

    • 我的导入/上传过程是在 Person:username 上设置唯一约束,然后上传所有内容,全部在 Person 标签下。在同一个查询中,我有一系列 CASE WHEN + FOREACH 语句检查节点属性并向其添加特定标签。你的意思是我可能需要限制每个单独的标签?
    • 是的。我有一个类似的问题。我的二级标签只有 3 个选择,不知道你要添加多少。我发现为三个二级标签中的每一个添加唯一性约束都会以指数方式提高速度。
    【解决方案2】:

    您正在对旧索引使用index 命令,使用schema 列出架构索引和约束

    此外,如果您通过 :Geotagged(username) 匹配,则您必须拥有该组合的索引:

     create index on :Geotagged(username);
    

    或者改为匹配:Person(username)

    【讨论】:

    • 迈克尔,谢谢!我为此苦苦挣扎。有没有办法在已经存在的节点上创建索引?似乎 create index 命令只是添加了索引,实际上并没有索引节点。
    • 我开始写一篇文章,如果对你有帮助,你能给我一些反馈吗? gist.asciidoctor.org/…
    • 架构索引也将始终使用该标签和属性组合索引现有节点。
    • 嗨,Michael,我很乐意查看它并提供反馈,但我无法访问该文档,我认为 URL 不正确?
    • 我运行了“在 :Geotagged(username) 上创建索引”,不到一秒就完成了,好像没有要索引的节点一样。那应该在所有现有节点上建立索引?我想这需要几分钟?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-11
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    相关资源
    最近更新 更多