我是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运行速度很慢,我该怎么办?任何帮助将不胜感激。
答案 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