Neo4J在节点之间建立关系的恐惧

时间:2017-06-17 05:58:36

标签: optimization neo4j graph-databases

我正在处理大约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分钟。 是他们的任何其他方法来建立关系或以任何方式优化此查询。

1 个答案:

答案 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。