我可以在cypher中创建具有多个属性的索引吗?
我的意思是
CREATE INDEX ON :Person(first_name, last_name)
如果我理解正确,这是不可能的,但如果我想编写如下的查询:
MATCH (n:Person)
WHERE n.first_name = 'Andres' AND n.last_name = 'Doe'
RETURN n
这些指数是否有意义?
CREATE INDEX ON :Person(first_name)
CREATE INDEX ON :Person(last_name)
或者我应该尝试在一个属性中合并“first_name”和“last_name”吗?
谢谢!
答案 0 :(得分:10)
索引适用于定义映射到某个值或一组值的某个键。关键始终是一个维度。
考虑你的例子:
CREATE INDEX ON :Person(first_name)
CREATE INDEX ON :Person(last_name)
这两个索引现在映射到具有相同名字的人,并分别映射具有相同姓氏的人。因此,对于数据库中的每个人,都会创建两个索引,一个在名字上,另一个在姓氏上。
据统计,这个例子很臭。为什么?因为分布是随机的。您将创建许多映射到数据库中的小群集/人群的索引。您将在JOHN
上为第一个名称编制许多节点索引。同样地,您将在SMITH
上为姓氏编制许多节点索引。
现在,如果要索引用户的全名,请连接,形成JOHN SMITH
。然后,您可以将人员的属性设置为person.full_name
。虽然它是多余的,但它允许您执行以下操作:
创建
CREATE INDEX ON :Person(full_name)
匹配
MATCH (n:Person)
USING INDEX n:Person(full_name)
WHERE n.full_name = 'JOHN SMITH'
您可以随时参考http://docs.neo4j.org/refcard/2.0/了解更多提示和指南。
干杯,
肯尼
答案 1 :(得分:4)