performance - Should neo4j be very slow on a lot of merge reqests? -
i'm experiencing slow neo4j, htop shows it's lucene ate cpus on server.
i'm writing data, attempting 50-500 cypher requests per second, each
foreach (id in {ids} | merge (:community {id: id}))
all 3 request generators here https://github.com/publicradio/vk_graph_reflector/tree/master/lib/reflectors (yes, javascript es2015)
i've started suspect lucene slow down because of merge requests, right? can reason? how can optimise stuff if i'm right?
can share visual query plan?
just take query , prefix profile
in browser.
i think it's number of things:
- use cypher parameters not string substitution
- try merge on single properties have constraint (or index)
- if don't need merge use match, i.e. if data exists !
- if don't need unique relationships use create, i.e. when know need connect new nodes existing nodes.
something this:
match (group:vk_group {id: {group_id} }) merge (post:vk_wall_post { id: {post_id}}) on create set post.date={post_date} create unique (group)-[:published]-(post) foreach (track in {tracks} | merge (tracknode:vk_track {id: track.id}) on create set tracknode.title=track.title, tracknode.duration=track.duration merge (artist:artist {name: track.artist}) merge (tracknode)<-[:performed]-(artist) merge (post)-[:attached]->(tracknode) )
alternatively able use match loop:
match (group:vk_group {id: {group_id} }) merge (post:vk_wall_post { id: {post_id}}) on create set post.date={post_date} create unique (group)-[:published]-(post) unwind {tracks} track merge (tracknode:vk_track {id: track.id}) on create set tracknode.title=track.title, tracknode.duration=track.duration merge (artist:artist {name: track.artist}) merge (tracknode)<-[:performed]-(artist) merge (post)-[:attached]->(tracknode)
Comments
Post a Comment