cypher 2.0:使用基于标签的索引来搜索一组节点

时间:2014-02-07 01:26:17

标签: neo4j cypher

我有usersgroups他们所属的人。 我有一个索引n:组(名称)

我想搜索属于一组群组的所有用户:[“gr1”,“gr2”,“gr3”]

他们所属的其他群体。

所以我有以下查询: 查询:

MATCH (gr:Group) <--(us:User)--(gr2:Group)
WHERE gr.name in ["gr1","gr2"]
return distinct gr2

这里的问题是,我认为cypher不使用索引,因为查询会变慢。

我有2k节点,50k关系。 以下查询需要200到700毫秒(取决于缓存):

MATCH (gr:Group) <--(us:User)--(gr2:Group)
WHERE gr.name = "gr1"
return distinct gr2

但是,以下查询需要2到6秒!

MATCH (gr:Group) <--(us:User)--(gr2:Group)
WHERE gr.name in ["gr1"]
return distinct gr2

当我想要做的时候:

MATCH (gr:Group) <--(us:User)--(gr2:Group)
using index gr:Group(name)
WHERE gr.name in ["gr1"]
return distinct gr2

我收到以下错误:

Cannot use index hint in this context. The label and property comparison must be specified on a non-optional node
Label: `Group`
Property name: `name`

(用“=”代替“in”我没有错误)

我正在使用neo4j enterprise 2.0.1。测试结果来自neo4j浏览器。

1 个答案:

答案 0 :(得分:3)

当您在(gr:Group {name: "gr1"})中指定模式中的属性或调用WHERE gr.name = "gr1"时,可以引用索引。在您可以使用多个attrib值的情况下,您可以使用OR子句。

MATCH (gr:Group) <--(us:User)--(gr2:Group)
WHERE gr.name="gr1" OR gr.name="gr2"
return distinct gr2