我有一个问题,你能帮助我吗?
在我真正的neo4j2.1.3中,有节点和关系。所以我必须使用自动索引来提高性能。
例如:属性键' person_name',' hotel_name'用于节点自动索引。和' inTime'关系自动索引。
然后,我创建数据:
create (:Person {person_name:'p1'})
create (:Person {person_name:'p2'})
create (:Hotel {hotel_name:'h1'} )
create (:Hotel {hotel_name:'h2'} )
start p=node:node_auto_index('person_name:p1'),h=node:node_auto_index('hotel_name:h1')
create (p)-[:STAY_IN {inTime:'20140520'}]->(h)
start p=node:node_auto_index('person_name:p1'),h=node:node_auto_index('hotel_name:h2')
create (p)-[:STAY_IN {inTime:'20140522'}]->(h)
start p=node:node_auto_index('person_name:p2'),h=node:node_auto_index('hotel_name:h1')
create (p)-[:STAY_IN {inTime:'20140510'}]->(h)
接下来,我输入这个密码:
start p=node:node_auto_index('person_name:p1'),
r=relationship:relationship_auto_index('inTime:[20140501 TO 20140530]')
match (p)-[r]-(h) return p,r,h
我只想找回' p1'留在。但上面的密码返回p1和p2的关系。为什么?
任何帮助将不胜感激。
答案 0 :(得分:2)
对于这种用例,我根本不会使用自动索引,我也不认为需要索引关系。你想得到回答的问题是basicall“在时间框架t_min给我留下任何酒店的人p1到t_max吗?”。
创建架构索引以快速查找起点,即相关人员:
CREATE INDEX ON :Person(person_name)
您的查询将如下所示:
MATCH (p1:Person {person_name:"p1"})-[stay:STAY_IN]->(hotel)
WHERE stay.inTime>=t_min AND stay.inTime<=t_max
RETURN stay, hotel
Neo4j中的索引应该只用于识别查询的起点。进入图表后,只需遵循关系并尝试避免后续索引查找,例如关系上的索引搜索。
在您的代码中,第二个索引查询将返回给定时间范围内任何人的所有停留。这用于与p
的交叉产品,这也是您p2
的原因。