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'而不是=。
答案 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
)。