我正在处理大约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分钟。 是他们的任何其他方法来建立关系或以任何方式优化此查询。
答案 0 :(得分:1)
是。首先,确保你有一个索引:TweetData(位置),这是最重要的变化,因为没有它,每个单个节点查找都必须扫描所有50k:TweetData节点的公共位置(即50k ^ 2查找)。 / p>
接下来,最好确保一个节点的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节点太多,这种方法也更容易用于批处理。您可以在匹配a
后使用LIMIT和SKIP。