在Neo4j / Cypher中对多个属性创建索引

9
我可以用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个回答

11

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

考虑你的例子:

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. 匹配

  3. MATCH (n:Person)
    USING INDEX n:Person(full_name)
    WHERE n.full_name = 'JOHN SMITH'
    

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

祝好,

Kenny


1
但是,如果他只想在名字的第一个或最后一个上运行搜索呢?需要使用正则表达式吗?这样做仍然会有很好的折衷,还是最好拥有单独的字段索引。我在思考如何最好地索引描述地点位置的某些字段-国家、城市、地名。并且搜索可以在任何一个字段上运行。 - Max Yari
1
如果您有一个整数属性和一个文本属性,那该怎么办呢?假设您想同时在整数范围上进行搜索并过滤文本属性,查询规划器会匹配一个索引还是两个索引都利用呢? - rotten
在从csv文件导入数据之前,是否可以将两个属性组合起来? - Aqqqq

9

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

CREATE INDEX ON :Person(first_name, last_name)

您可以在这里了解更多关于复合索引的内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接