如何在此查询中使用索引提示?

时间:2018-04-02 23:33:50

标签: neo4j cypher

match (s:Product {type:'Phone'})-[r]->(o:Attributes)
USING INDEX o:Attributes(resolution)
WHERE any(key in keys(o) WHERE key='resolution' AND o[key] contains '2000')
return s, o limit 2

我对此查询有两个问题:

1)它报告了这种语法中的错误:使用索引o:属性(分辨率)',这是不允许的。

2)我之所以使用这个'其中'子句格式是我的key& value将是通过函数传递的变量。 WHERE子句实际上如下所示:

WHERE any(key in keys(o) WHERE key=$kgKey AND o[key] = $kgValue)

希望我能先解决第一个问题,然后尝试解决第二个问题。

编辑: 我想在此查询中实现的目标是:找出具有特定解决方案的所有手机'价值,即'分辨率= 2000'。由于该条款将过滤其他类似的属性,如' resolution'我也不能用硬代码来解决问题'在查询中。

为了允许部分匹配,我使用o [key] CONTAINS' 2000'而不是=。

1 个答案:

答案 0 :(得分:1)

索引与节点标签的指定属性相关联,目前Cypher规划人员只有足够聪明才能支持在{中指定索引属性的方式的子集。 {一对。您可能收到了类似这样的错误消息:

  

Neo.ClientError.Statement.SyntaxError:不能在此使用索引提示   上下文。索引提示仅支持以下谓词   在WHERE中(直接或作为顶级AND或OR的一部分):   平等比较,不等(范围)比较,STARTS WITH,IN   条件或检查财产存在。比较不可能   在两个属性值之间执行。注意标签和   必须在非可选节点上指定属性比较...

您可以尝试在MATCH/WHERE的多个属性上创建索引,Cypher规划器可能生成一个使用所有这些属性的计划(使用PROFILE选项检查生成的计划)。

但是,如果你在Attributes上也有一个索引,你可能想放弃它(因为该索引可以匹配很多节点,并且由于创建了大型笛卡尔积而使你的性能恶化)。

例如,如果您有3个:Product(type)属性(分辨率,foo和bar)并且所有属性都有索引,则Cypher规划器可能生成一个使用所有属性的计划查询上的3个索引如下所示:

Attributes

不幸的是,您无法添加MATCH (s:Product {type:'Phone'})-->(o:Attributes) WHERE o.resolution = '2000' OR o.foo = 123 OR o.bar = 'abc' RETURN s, o LIMIT 2; 提示来告诉规划人员使用所有索引,因为另一个当前限制是您只能为每个变量提供单个索引提示(例如USE INDEX)。