Neo4j / Cypher中多个属性的索引

时间:2013-12-10 10:04:32

标签: neo4j cypher

我可以在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”吗?

谢谢!

2 个答案:

答案 0 :(得分:10)

索引适用于定义映射到某个值或一组值的某个键。关键始终是一个维度。

考虑你的例子:

CREATE INDEX ON :Person(first_name)
CREATE INDEX ON :Person(last_name)

这两个索引现在映射到具有相同名字的人,并分别映射具有相同姓氏的人。因此,对于数据库中的每个人,都会创建两个索引,一个在名字上,另一个在姓氏上。

据统计,这个例子很臭。为什么?因为分布是随机的。您将创建许多映射到数据库中的小群集/人群的索引。您将在JOHN上为第一个名称编制许多节点索引。同样地,您将在SMITH上为姓氏编制许多节点索引。

现在,如果要索引用户的全名,请连接,形成JOHN SMITH。然后,您可以将人员的属性设置为person.full_name。虽然它是多余的,但它允许您执行以下操作:

  1. 创建

    CREATE INDEX ON :Person(full_name)
    
  2. 匹配

    MATCH (n:Person)
    USING INDEX n:Person(full_name)
    WHERE n.full_name = 'JOHN SMITH'
    
  3. 您可以随时参考http://docs.neo4j.org/refcard/2.0/了解更多提示和指南。

    干杯,

    肯尼

答案 1 :(得分:4)

从3.2开始,Neo4j支持复合索引。以你的例子:

CREATE INDEX ON :Person(first_name, last_name)

您可以阅读有关复合索引here的更多信息。