如何在cypher中使用节点和关系自动索引?

时间:2014-10-10 06:48:20

标签: indexing neo4j cypher

我有一个问题,你能帮助我吗?

在我真正的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的关系。为什么?

任何帮助将不胜感激。

1 个答案:

答案 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的原因。

相关问题