Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有强制索引的Neo4j问题_Neo4j_Cypher - Fatal编程技术网

具有强制索引的Neo4j问题

具有强制索引的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

我遇到了一个问题,我在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
行.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社区版。我已提交
使用索引
错误。