2017-06-17 96 views
0

我正在處理大約50000條tweets,其節點具有類似的數據,如下所示。Neo4J Optimsation用於創建節點之間的關係

{ "date": "2017-05-26T09:50:44.000Z", "author_name": "djgoodlook", "share_count": 0, "mention_name": "firstpost", "tweet_id": "868041705257402368", "mention_id": "256495314", "location": "pune india", "retweet_id": "868039862774931456", "type": "Retweet", "author_id": "103535663", "hashtag": "KamalHaasan" }

我曾嘗試使用以下命令 MATCH (a:TweetData),(b:TweetData) WHERE a.location = b.location AND NOT a.tweet_id = b.tweet_id CREATE (a)-[r:SameLocation]->(b) RETURN r

並使用此命令我沒能做出的關係以製造具有相同位置的鳴叫之間的關係,因爲它是花了超過20小時仍然沒有產生結果。雖然對於hashtag關係,但它使用類似的命令工作正常,大約需要5分鐘。 是他們的任何其他方法來建立關係或任何方式來優化此查詢。

回答

1

是的。首先,確保你有一個關於TweetData(location)的索引,這是最重要的變化,因爲沒有每個節點查找都必須掃描所有50k:TweetData節點以查找公共位置(即50k^2查找)。

接下來,最好確保一個節點的ID小於另一個節點的ID,否則你會得到兩個相同的節點對,只是順序顛倒,導致每對的兩個關係,每個方向一個,而不僅僅是你想要的單一關係。

最後,你真的需要返回所有的關係嗎?這可能會導致瀏覽器中斷,也許只會返回添加關係的次數。其他

MATCH (a:TweetData) 
MATCH (b:TweetData) 
WHERE a.location = b.location AND a.tweet_id < b.tweet_id 
CREATE (a)-[r:SameLocation]->(b) 
RETURN count(r) 

一件事(強)考慮的是不是跟蹤常見位置這種方式,創建一個:位置節點,而是和所有鏈接:TweetData節點吧。

你需要將索引或唯一約束:位置(名稱),然後:

MATCH (a:TweetData) 
MERGE (l:Location {name:a.location}) 
CREATE (a)-[:LOCATION]->(l) 

這種方法也更容易自己借給配料,如果在一次50K節點是太多了。您可以在匹配後使用LIMIT和SKIP到a

+0

感謝您的建議,它真的幫了我。 我無法理解你說的第一部分,除了使用LIMIT和SKIP外,我們應該如何減少50k^2查找。 **確保您有一個關於TweetData(位置)的索引,這是最重要的更改** –

+0

閱讀[索引和約束文檔](http://neo4j.com/docs/developer-manual/current /暗號/模式/索引/)。無論何時您有很多節點,並且您需要通過某個屬性查找特定類型的節點,最好在標籤/屬性上有一個索引,以便您的匹配變得非常快。 – InverseFalcon

相關問題