2016-04-08 65 views
1

我的數據庫包含酒店,酒店評論,評論和主題中的術語(即單詞)(例如,可能有一個話題「Staff」,其中包含描述酒店員工的術語)作爲節點。所有節點上的索引都存在。關係如下:酒店< - 評論 - >期限 - >主題在neo4j中處理長路徑模式

我目前正試圖找到一種有效的方式來查詢有兩個或多個指定酒店路徑的主題。換句話說,我對兩家酒店的共同話題感興趣。如果酒店A的路徑爲主題1,2,3,酒店B的路徑爲主題2,3,4,則結果應爲2,3。

我嘗試了以下內容,但這看起來非常低效,這很可能是由於酒店和主題之間的可能路徑數量所致。基本上,評論中的每個單詞都可能會創建一個必須檢查的新路徑。

// show all topics that two hotels have in common 
MATCH (h2:Hotel)<--(r2:Review)-->(t2:Term)-->(to:Topic)<--(t1:Term)<--(r1:Review)-->(h1:Hotel) 
WHERE h1.id IN ["id1","id2"] AND h2.id IN ["id1","id2"] AND NOT h1.id=h2.id 
RETURN h1.id,to.topic, count(to) AS topic_mentions 

我想知道是否有處理這種更快的方式,如果我要實現這個Java或類似語言的我可能會嘗試做一個BFS開始在每一家酒店,然後走的重疊什麼我發現。我相當肯定,將傳遞邊添加爲直接邊緣酒店 - >主題會加快速度,但是我有限的數據庫設計知識告訴我這可能是不必要的冗餘,而不是一個好習慣?

我試圖在與另一個MATCH和WITH子句進行模式匹配之前做id匹配,但是這沒有加速任何事情;我認爲問題真的在於模式匹配本身。

回答

1

我爲搜索KB創建了類似的內容,酒店和主題之間的直接關係將使搜索變得簡單,而且速度會更快。例如,你用普通不止一個酒店的所有主題的搜索,你會使用:

MATCH (h1:Hotel)-[:TOPIC]->(t:Topic) 
MATCH (h2:Hotel)-[:TOPIC]->(t:Topic) 
WHERE h1 <> h2 
RETURN h1.id, h2.id, t.topic, count(t) AS topic_mentions 

注意,這將返回所有主題這兩家酒店的共同點,這可能是一個計數可能不是你想要的。

我相當肯定,直接邊加入邊傳遞酒店 - 主題將加快這,但我有限的數據庫設計 知識告訴我,這可能是不必要的冗餘,而不是一個 好的做法呢?

所有這些將會使隱式關係顯式化,這是使圖形數據庫如此強大的一件事情。維護方面需要關注 - 即如果有人更新了評論中的單詞,那麼您必須確保(酒店) - [:主題] - >(主題)關係仍然有效 - 但是您會無論如何都必須在原來的設計中做到這一點,所以不會有任何損失。