Indexing 通过在节点上添加多个索引减少查询时间-Neo4j
我有一个应用程序,它将推特数据流化并发送到两个卡夫卡主题。这些卡夫卡主题由两台不同的机器读取,它们将数据发送到Neo4j数据库(放置在两台机器之一上) 一些数据插入查询有一个Indexing 通过在节点上添加多个索引减少查询时间-Neo4j,indexing,neo4j,apache-kafka,cypher,nodes,Indexing,Neo4j,Apache Kafka,Cypher,Nodes,我有一个应用程序,它将推特数据流化并发送到两个卡夫卡主题。这些卡夫卡主题由两台不同的机器读取,它们将数据发送到Neo4j数据库(放置在两台机器之一上) 一些数据插入查询有一个MERGE子句,当数据增长时,这使得查询速度非常慢。现在,我试图减少查询时间 每次执行MERGE时,在节点上添加多个索引(它们已经有了一个索引)以获得较小的节点模式是否是一种好的做法?这有什么意义吗?下面是一个查询示例: MERGE (t:Tweet{tweet_id:{tweet_id}}) SET t.text={tex
MERGE
子句,当数据增长时,这使得查询速度非常慢。现在,我试图减少查询时间
每次执行MERGE
时,在节点上添加多个索引(它们已经有了一个索引)以获得较小的节点模式是否是一种好的做法?这有什么意义吗?下面是一个查询示例:
MERGE (t:Tweet{tweet_id:{tweet_id}})
SET t.text={text}, t.language={language},
t.created_at={created_at}, t.retweetcount={retweetcount},
t.likecount={likecount}, t.location={location}
查询计划:
根据查询计划,您应该在标签
tweet
的tweet\u id
字段上创建一个唯一约束:
CREATE CONSTRAINT ON (n:Tweet) ASSERT n.tweet_id IS UNIQUE
因此,您不必执行NodeByLabelScan
加上过滤器
,而是执行一个NodeUniqueIndexSeek
开关,该开关非常好
此外,您对数据库所做的工作越少,性能越好:)
因此,如果当节点已经存在时,您只需更新字段favorite\u count
&retweet\u count
,则应使用MERGE
的子命令对创建集和对匹配集
,如下所示:
MERGE (t:Tweet{tweet_id:{tweet_id}})
ON CREATE SET
t.text={text},
t.language={language},
t.created_at={created_at},
t.retweetcount={retweetcount},
t.likecount={likecount},
t.location={location}
ON MATCH SET
t.retweetcount={retweetcount},
t.likecount={likecount}
可以给出您的合并
查询及其解释
?我添加了一个query@logisima示例,您对有一个唯一的约束:Tweet Tweet\u id
?更详细地说,在您的查询中,为什么要使用SET
命令,在CREATE SET
上使用是不够的?不,我在以前的应用程序版本中使用过它,但它会使查询速度减慢得更慢。所以我删除了它,因为基本上我永远不会收到两条ID相同的推文。不幸的是,这还不够,因为有时我会转发推文,迫使我更新推文的一些信息(favorite_count,retweet_count)。我会尝试让你知道它是否更好。非常感谢你。