2014-10-10 104 views
0

我有一個問題,你能幫我嗎?如何在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。爲什麼?

任何幫助將不勝感激。

回答

2

對於這種用例,我根本不會使用autoindexes,我也沒有看到需要爲這些關係編制索引。你想要回答的問題基本上是「在時間範圍t_min給t_max的任何酒店給我人p1的住宿嗎?」。

創建模式索引以便快速查找起點,又名人的問題:

CREATE INDEX ON :Person(person_name) 

您的查詢應該是這樣的:在Neo4j的

MATCH (p1:Person {person_name:"p1"})-[stay:STAY_IN]->(hotel) 
WHERE stay.inTime>=t_min AND stay.inTime<=t_max 
RETURN stay, hotel 

指標應該只是使用以確定您的查詢的起點。一旦你在圖表中,只需遵循關係,並嘗試避免後續的索引查找,如索引搜索關係。

在您的代碼中,第二個索引查詢將返回給定時間範圍內任何人的所有逗留。這用於與p交叉產品,這就是爲什麼你也得到了p2

+0

嗨,@Stefan Armbruster,謝謝你的回覆。 你看我說了什麼。但我的情況並非如此簡單。 我試過了模式索引。但它不支持範圍查詢。它不支持模糊搜索。它只用於完全匹配。 例如:如果我已創建2索引屬性鍵 'PERSON_NAME' 和 'person_birthday': 創建索引ON:人(PERSON_NAME) 創建索引ON:人(person_birthday) 如果i型這些查詢: 匹配(對:Person)其中p.person_name ='Mike *'返回p 匹配(p:Person)其中p.person_birthday>'19800501'返回p 模式索引不起作用。 – 2014-10-10 11:01:51

+0

讓我們回到前面的問題,在我的真實情況下,考慮這個: 如果neo4j db中有多個人員節點,並且每個節點也與其他節點有毫秒關係。所以我該怎麼做? 再次感謝您的幫助。 – 2014-10-10 11:03:09

+0

我很確定,如果將日期保存爲整數而不是字符串,則可以使用範圍執行匹配,並使用索引。 '匹配(p:Person),其中p.person_birthday> 19800501返回p'。就模糊搜索而言,我通常推薦使用Elasticsearch。它會做得更好,讓Neo4j做到最好。 – subvertallchris 2014-10-10 13:18:49

相關問題