用于创建节点间关系的 Neo4J 优化

Neo4J Optimsation For Creating Relationships Between Nodes

我正在处理大约 50000 条推文作为具有类似数据的节点,如下所示。

{ "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 多个小时仍然没有产生结果。虽然对于主题标签关系,它使用类似的命令效果很好,因为它需要大约 5 分钟。 他们是否有任何其他建立关系的方法或任何优化此查询的方法。

是的。首先,确保你在 :TweetData(location) 上有一个索引,这是最重要的变化,因为如果没有这个索引,每个节点查找都必须扫描所有 50k :TweetData 节点以查找一个公共位置(即 50k ^2 查找)。

接下来,最好确保一个节点的 id 小于另一个,否则你会得到两次相同的节点对,只是顺序颠倒了,导致每一对都有两个关系,每个方向一个。 , 而不仅仅是你想要的单一关系。

最后,你真的需要 return 所有关系吗?这可能会杀死您的浏览器,也许 return 只是添加的关系数。

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)

要(强烈)考虑的另一件事是不要以这种方式跟踪常见位置,而是创建一个 :Location 节点,然后 link 所有 :TweetData 节点都指向它。

您将需要对 :Location(name) 的索引或唯一约束,然后:

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

如果一次 50k 个节点太多,这种方法也更容易用于批处理。您可以在匹配 a.

后使用 LIMIT 和 SKIP