Neo4j/Cypher中多个属性的索引

Gui*_*acy 6 neo4j cypher

我可以在cypher中创建具有多个属性的索引吗?

我的意思是

CREATE INDEX ON :Person(first_name, last_name)
Run Code Online (Sandbox Code Playgroud)

如果我理解正确,这是不可能的,但如果我想编写如下查询:

MATCH (n:Person)
WHERE n.first_name = 'Andres' AND n.last_name = 'Doe'
RETURN n
Run Code Online (Sandbox Code Playgroud)

这些指数有意义吗?

CREATE INDEX ON :Person(first_name)
CREATE INDEX ON :Person(last_name)
Run Code Online (Sandbox Code Playgroud)

或者我应该尝试在一个属性中合并"first_name"和"last_name"?

谢谢!

Ken*_*ani 10

索引适用于定义映射到某个值或值集的某些键.关键始终是单一维度.

考虑你的例子:

CREATE INDEX ON :Person(first_name)
CREATE INDEX ON :Person(last_name)
Run Code Online (Sandbox Code Playgroud)

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

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

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

  1. 创建

    CREATE INDEX ON :Person(full_name)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 比赛

    MATCH (n:Person)
    USING INDEX n:Person(full_name)
    WHERE n.full_name = 'JOHN SMITH'
    
    Run Code Online (Sandbox Code Playgroud)

您可以随时参考http://docs.neo4j.org/refcard/2.0/获取更多提示和指南.

干杯,

肯尼


小智 5

从3.2开始,Neo4j支持复合索引。例如:

CREATE INDEX ON :Person(first_name, last_name)

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