2017-06-17 119 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

相关问题