Neo4j执行索引的问题

时间:2016-11-30 18:59:35

标签: 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字符串。问题是我收到错误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

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

1 个答案:

答案 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