Indexing 通过在节点上添加多个索引减少查询时间-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

我有一个应用程序,它将推特数据流化并发送到两个卡夫卡主题。这些卡夫卡主题由两台不同的机器读取,它们将数据发送到Neo4j数据库(放置在两台机器之一上)

一些数据插入查询有一个
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)。我会尝试让你知道它是否更好。非常感谢你。