我遇到了一个我在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.source
和row.target
以及两个UUID字符串。问题是我收到错误ERROR - Cannot use index hint in this context
。
如果我将查询扩充为仅返回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
没有抛出任何错误,并且返回了关系,因此我有点困惑这个问题是什么?
答案 0 :(得分:5)
[增订]
您的第二个查询也更改了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