我应该如何在我的案例中使用索引或密码?

时间:2014-10-16 09:25:35

标签: indexing neo4j

我是neo4j的新手。我真的需要你的帮助我的情况是:

在一个城市,有成千上万的酒店,我使用带有'Hotel'标签的节点代表它。每家酒店都有hotel_name,hotel_address,hotel_telephone ......

此外还有数百万人。我使用带有标签'Person'的节点来代表人,每个人都有属性person_name,person_identity,person_age。

当一个人入住酒店时,我创建了一个从人节点到酒店节点的关系,该关系的属性为in_time,格式为'20130820134000'(YYYYMMDDHHMISS)。

我启用了自动索引:

带属性键的

node_auto_index:hotel_name,person_name,person_identity

relationship_auto_index with property key:in_time

我的neo4j数据库中存在数千万个关系。

现在我想询问人们在时间点'20130910080000'和'20130911080000'之间入住酒店的人数,限制人数等于20。

我的密码如下:

start r = relationship:relationship_auto_index('in_time:[20130910080000 TO 20130911080000]')
match (p:Person)-[r]-(h:Hotel)
where p.person_age=20
return p,r,h

但上面的这个cypher运行速度很慢,我该怎么办?任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

此条款就在这里:

relationship:relationship_auto_index('in_time:[20130910080000 TO 20130911080000]')

使用lucene索引(范围位是lucene查询语法)。我不是100%肯定在这里,但我想知道这有多大选择性 - 这个索引检查可能会在每个关系上运行,而不仅仅是与你的路径相匹配的关系。

所以你可能想要尝试这个查询:

match (p:Person)-[r]-(h:Hotel)
where p.person_age=20 AND
      r.in_time >= 20130910080000 AND
      r.in_time <= 20130911080000
return p,r,h

理论上,这会立即缩小到正确路径上的那些关系(不仅仅是任何关系),然后希望只有那些与正确年龄的人相关的人才能进一步缩小它。试一试。

开发人员可能想在此处评论cypher如何评估不同的索引。

您还应该使用profile keyword以两种方式尝试查询,以查看哪种方式可以为您提供更好的执行计划。

答案 1 :(得分:0)

尝试此查询:

start r = relationship:relationship_auto_index('in_time:[20130910080000 TO 20130911080000]')
WITH  startNode(r) as p, endNode(r) as h, r
WHERE p:Person and h:Hotel and p.person_age=20
return p,r,h