具有强制索引的Neo4j问题
我遇到了一个问题,我在Cypher批处理查询中强制使用索引具有强制索引的Neo4j问题,neo4j,cypher,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 其中行.source和行.targe
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
其中行.source
和行.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的最新版本实际上能够在该场景中使用索引,但是如果您试图指定usingindex
子句作为提示,neo4j会抱怨。这可能是一个bug。我已经提交了这个
但是,当索引用于将属性值与标识符或文本进行比较时(就像您在第二次查询中所做的那样),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
我没有意识到这一点。这是否适用于索引查找的所有情况,包括与CSV导入的行属性匹配时?我看到的大多数示例都直接使用row属性,而不是首先使用别名,所以这意味着永远不会使用索引?包括合并?我不希望这样的查询能够使用索引。我已经更新了我的答案,更完整地描述了这个问题。所以,我现在明白了,我最后的评论通常不是真的。对于最新版本的neo4j,此类查询可以在该场景中使用索引,但前提是规划人员选择使用索引。您不能使用
USING INDEX
子句给出提示。您使用的是哪个版本?这应该在较新版本中修复。我实际上在3.1.0-M13-beta3浏览器上尝试过,但仍然出现错误。@MichaelHunger查看我的更新答案。在最近的neo4j版本中,这种行为似乎是代码的一个缺陷,该代码检查是否允许使用索引。@MichaelHunger我们使用的是3.0.3社区版。我已提交使用索引错误。