强制索引的 Neo4j 问题

标签 neo4j cypher

我遇到了一个问题,我在 Cypher 批量查询中强制使用索引,

UNWIND {rows} AS row
MATCH (s:Entity)
USING INDEX s:Entity(uuid)
WHERE s.uuid = row.source
MATCH (t:Entity)
USING INDEX t:Entity(uuid)
WHERE t.uuid = row.target
MATCH (s)-[r:CONSUMED]->(t)
DELETE r

其中 row.sourcerow.target 以及两个 UUID 字符串。问题是我收到错误,错误 - 无法在此上下文中使用索引提示

如果我增加查询以仅返回 Neo4j UI 中特定源节点和目标节点的关系,即

MATCH (s:Entity)
USING INDEX s:Entity(uuid)
WHERE s.uuid = '04bc79e1-a836-11e6-b841-22000bcec6a9'
MATCH (t:Entity)
USING INDEX t:Entity(uuid)
WHERE t.uuid = 'a245f46a-a837-11e6-b841-22000bcec6a9'
MATCH (s)-[r:CONSUMED]->(t)
RETURN r

没有抛出任何错误并且返回了关系,因此我有点困惑可能是什么问题?

最佳答案

[更新]

您的第二个查询还更改了 WHERE 子句,这就是它起作用的原因。

neo4j 目前不支持USING INDEX 子句用于将用于相互比较属性值的索引(就像您在第一个查询中所做的那样) .

注意:neo4j 的最新版本实际上能够在那种情况下使用索引,但如果您尝试指定 USING INDEX 子句作为提示,neo4j 会报错。这可能是一个错误。我提交了Issue 8463为此。

但是,当使用索引将属性值与标识符或文字进行比较(就像您在第二个查询中所做的那样)时,neo4j 对 USING INDEX 子句没有任何问题。

幸运的是,有一个简单的解决方法。您可以只为属性值创建标识符并改用这些标识符。例如,查看此处如何使用 WITH 子句:

UNWIND {rows} AS row
WITH row.source AS source, row.target AS target
MATCH (s:Entity)
USING INDEX s:Entity(uuid)
WHERE s.uuid = source
MATCH (t:Entity)
USING INDEX t:Entity(uuid)
WHERE t.uuid = target
MATCH (s)-[r:CONSUMED]->(t)
DELETE r

关于强制索引的 Neo4j 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40896132/

相关文章:

jruby - bundler 无法识别平台?找不到 gem

neo4j - 密码查询 : Is it possible to "hide" an existing path with a "virtual relationship"?

neo4j - 获取与特定节点相关但与另一个节点不相关的所有节点

neo4j - 如何计算属性之间的差异和百分位数?

types - Cypher 查询返回 Neo4j 图中每种类型的一个关系

php - 如何在密码中匹配多个关系

linux - 从 Windows 下载 debian Neo4j 版本

java - 使用 neo4j 嵌入式 java api 为关系添加权重

python - 将 CSV 从安全的 S3 存储桶加载到在 docker 中运行的 Neo4j 中

ruby-on-rails - Neo4j.rb 创建独特的关系