【问题标题】:Index on multiple properties in Neo4j / CypherNeo4j / Cypher 中多个属性的索引
【发布时间】:2013-12-27 18:53:20
【问题描述】:

我可以在 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”合并到一个属性中?

谢谢!

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    从 3.2 开始,Neo4j 支持复合索引。以您为例:

    CREATE INDEX ON :Person(first_name, last_name)

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

    【讨论】:

      【解决方案2】:

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

      考虑你的例子:

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

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

      从统计上看,这个例子很糟糕。为什么?因为分布是随机的。您将创建大量索引,这些索引映射到数据库中的小型集群/人群。您将在JOHN 上为名字索引很多节点。同样,您将在SMITH 上为姓氏编制索引。

      现在如果你想索引用户的全名,然后连接,形成JOHN SMITH。然后,您可以将 person 的属性设置为 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'
        

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

      干杯,

      肯尼

      【讨论】:

      • 但如果他只想搜索名字或姓氏?将不得不使用正则表达式?它是否仍然可以很好地权衡,或者最好有单独的字段索引。问这个因为我在思考如何最好地索引一些描述地点位置的字段 - 国家、城市、地名。搜索可以在任何这些字段上运行。
      • 如果你有一个整数属性和一个文本属性怎么办?假设您想同时搜索整数范围并过滤 text 属性?查询计划器是只匹配一个索引,还是同时利用两者?
      • 在从 csv 文件导入数据之前,是否可以合并两个属性?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-30
      • 1970-01-01
      相关资源
      最近更新 更多