Neo4j执行索引的问题

Joh*_*ohn 3 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
Run Code Online (Sandbox Code Playgroud)

哪里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
Run Code Online (Sandbox Code Playgroud)

没有错误被抛出并且关系被返回,因此我有点困惑的问题是什么?

cyb*_*sam 5

[更新]

您的第二个查询也更改了WHERE子句,这就是它工作的原因.

Neo4j的目前不支持使用USING INDEX条款的,将被用于属性值相互比较的指标(如你在第一个查询做).

注意:neo4j的最新版本实际上能够在该场景中使用索引,但如果您尝试将该USING INDEX子句指定为提示,则neo4j会抱怨.这可能是一个错误.我已为此提交了问题8463.

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

幸运的是,有一个简单的解决方法.您只需为属性值创建标识符,然后使用这些标识符.例如,请在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
Run Code Online (Sandbox Code Playgroud)