Neo4j рдЧреНрд░рд╛рдл рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдЖрд░рдВрдн рдХрд░рдирд╛

рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдЙрддреНрдкрдиреНрди рд╣реБрдП - рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╕рд╛рдорд╛рди рдХреЗ рд╕рд╛рде рдПрдХ рдЖрдзрд╛рд░ рд╣реИ, рд╕реИрдХрдбрд╝реЛрдВ рд╣рдЬрд╛рд░реЛрдВ рдХреЗ рд╕реНрддрд░ рдкрд░ред рдкреНрд░рддреНрдпреЗрдХ рдЙрддреНрдкрд╛рдж рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕реИрдХрдбрд╝реЛрдВ рд╣реЛрддреЗ рд╣реИрдВред рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЙрддреНрдкрд╛рдж рджреНрд╡рд╛рд░рд╛ рддреНрд╡рд░рд┐рдд рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЧрдарди рдХрд╛ рд╕рдордп 0.3 рд╕реЗрдХрдВрдб рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЖрдкрдХреЛ рд╢реИрд▓реА рдореЗрдВ рдЬрдЯрд┐рд▓ рддрд░реНрдХ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

(1 = true AND (2 < 100)) OR (1 = false AND (3 > 17)) ...     AND\OR 


рдРрд╕реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг hotline.ua/computer/myshi-klaviatury рд╣реИ

рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЙрджрд╛рд╣рд░рдг

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ MySQL + Symfony2 / Doctrine рдХреЗ рдврд╛рдВрдЪреЗ рдореЗрдВ рд╕рдм рдХреБрдЫ рд▓рд╛рдЧреВ рд╣реИ, рдЧрддрд┐ рдЕрд╕рдВрддреЛрд╖рдЬрдирдХ рд╣реИ - рдЬрд╡рд╛рдм 1-10 рд╕реЗрдХрдВрдб рдХреЗ рднреАрддрд░ рдмрдирддреЗ рд╣реИрдВред рдЗрд╕ рд╕рднреА рдЕрд░реНрдерд╡реНрдпрд╡рд╕реНрдерд╛ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рдореЗрд░реЗ рдкреНрд░рдпрд╛рд╕ рдХрдЯ рдХреЗ рддрд╣рдд рд╣реИрдВред


рдорд╛рд▓ рдХреЛ рдЫрд╛рдирдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХреА рд╢рдмреНрджрд╛рд╡рд▓реА (рд╕рд░рд▓реАрдХреГрдд рд░реВрдк рдореЗрдВ)



рд╣реЙрдЯрд▓рд╛рдЗрди рдХрд╛ рдПрдХ рдЕрдзрд┐рдХ рдЙрдиреНрдирдд рд╕рдВрд╕реНрдХрд░рдг рд╣реИ - рдПрдХ рд╕рдВрдХреЗрдд рдХреЗ рд╕рд╛рде рдХрд┐ рдХрд╕реМрдЯреА рдХреА рд╕рдХреНрд░рд┐рдпрддрд╛ рдХреЗ рдмрд╛рдж рдХрд┐рддрдиреЗ рдЙрддреНрдкрд╛рдж рдмрдиреЗ рд░рд╣реЗрдВрдЧреЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк "рдмреНрд▓реВрдЯреВрде" рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкреГрд╖реНрда рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, "рдорд╛рдЙрд╕ рд╕реЗрдВрд╕рд░ рдкреНрд░рдХрд╛рд░ рдСрдкреНрдЯрд┐рдХрд▓ рд╣реИ" рдлрд┐рд▓реНрдЯрд░ 17 рд╣реЛрдЧрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рди рдХреЗрд╡рд▓ рдорд╛рдирджрдВрдбреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЪрдпрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдкрд╣рд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рд╢реЗрд╖ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЗ рд▓рд┐рдП рдЙрддреНрдкрд╛рджреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рднреА рдЧрдгрдирд╛ рдХрд░реЗрдВред рдЗрд╕рдХреА рд╕рдХреНрд░рд┐рдпрддрд╛ред

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ Neo4j рдЧреНрд░рд╛рдл рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдЖрдЬрд╝рдорд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рд╕рддрд╣реА рд╕рдореАрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЛ рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред

Neo4j рдХреА рд╢рдмреНрджрд╛рд╡рд▓реА рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЧреНрд░рд╛рдлрд╝ рдбреЗрдЯрд╛рдмреЗрд╕ред




рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдпреЛрдЬрдирд╛


рдкреНрд░рддреНрдпреЗрдХ рдЙрддреНрдкрд╛рдж рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдиреЛрдб рдмрдирд╛рдПрдВ, рдиреЛрдб рдХреЗ рдЧреБрдгреЛрдВ рдореЗрдВ рдЙрддреНрдкрд╛рдж рдЖрдИрдбреА рдХреЛ MySQL рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░реЗрдВред рдкреНрд░рддреНрдпреЗрдХ рдорд╛рдирджрдВрдб рдХреЗ рд▓рд┐рдП, рдЧреБрдгреЛрдВ рдореЗрдВ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдиреЛрдб рдмрдирд╛рдПрдВ, рдорд╛рдкрджрдВрдб рдХреА рдЖрдИрдбреА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВред рдЗрд╕рдХреЗ рдмрд╛рдж, рд╕рд╛рдорд╛рди рдХреЗ рд╕рднреА рдиреЛрдбреНрд╕ рдХреЛ рдорд╛рдкрджрдВрдб рдХреЗ рдиреЛрдбреНрд╕ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝ рджреЗрдВ рдЬреЛ рд╕рд╛рдорд╛рди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИрдВред рдЙрддреНрдкрд╛рдж рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдпрд╛ рдорд╛рдкрджрдВрдб рдЧреБрдгреЛрдВ рдХреЛ рдмрджрд▓рддреЗ рд╕рдордп, рдиреЛрдбреНрд╕ рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдзреЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВред

рдкрд╣рд▓рд╛ рд╕рдорд╛рдзрд╛рди Neo4j рдХреЗ рд╕рд╛рде рд╣реИ


рдпрд╣ рд╕рдордЭрддреЗ рд╣реБрдП рдХрд┐ рдореИрдВрдиреЗ рдХрднреА рдЧреНрд░рд╛рдлрд╝ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛, рдореИрдВрдиреЗ рдирд┐рдУ 4 рдЬреЗ рдХреЛ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдПрдХ рдмреБрдирд┐рдпрд╛рджреА рд╕реНрддрд░ рдкрд░ рд╕рд╛рдЗрдлрд░ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ред рдЕрдЧрд░ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, 1 рдорд┐рд▓рд┐рдпрди рдЙрддреНрдкрд╛рджреЛрдВ рдХреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХреА рдЧрддрд┐ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ 500 рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рд╣реИрдВред

рд╕рд┐рд╕реНрдЯрдо рдХреА рддреИрдирд╛рддреА рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ - рд╡рд┐рддрд░рдг рдХрд┐рдЯ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред

Neo4j рд╕рд░реНрд╡рд░ рдореЗрдВ RestAPI рд╣реИ, php рдХреЗ рд▓рд┐рдП neo4jphp рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИред Symfony2 рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдВрдбрд▓ рднреА рд╣реИ - klaussilveira / neo4j-ogm-рдмрдВрдбрд▓ ред

рд╡рд┐рддрд░рдг рдореЗрдВ рдПрдХ рд╡реЗрдм рд╕рд░реНрд╡рд░ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╢рд╛рдорд┐рд▓ рд╣реИ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ http: // localhost: 7474 /
рдЕрдиреНрдп рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рдЕрднреА рднреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рдПрдХ рдкреБрд░рд╛рдирд╛ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ ред

рдкреНрд░рд▓реЗрдЦрди рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдкреНрд░рд▓реЗрдЦрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдЧреНрд░рд╛рдлрдЧрд┐рд╕реНрдЯ рдореЗрдВ рд╣реИрдВред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЙрдиреНрд╣реЗрдВ рд╡рд╣рд╛рдВ рдСрдирд▓рд╛рдЗрди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЕрдм рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдХреЛрдб рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЧреНрд░рд╛рдлрдЧрд┐рд╕реНрдЯ рдХреЗ рд▓рд┐рдВрдХ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдВ ) рдФрд░ рдкреГрд╖реНрда рд╕реНрд░реЛрдд рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред

Neo4j рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдЯ-рдЗрди рд╡реЗрдм рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ ред рд╡рд╣рд╛рдВ рдЖрдк рд╕рд╛рдЗрдлреНрд░реЛ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдиреЛрдбреНрд╕ рдХреЗ рдХрдиреЗрдХреНрд╢рди рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

Node4j рдПрдВрдмреЗрдбреЗрдб рдХреНрд▓рд╛рдЗрдВрдЯ

рд╕рд┐рдВрдкрд▓ рд╕рд╛рдЗрдкрд░ рдХрдорд╛рдВрдбреНрд╕

рдПрдХ рд▓реЗрдмрд▓ рдХреЗ рд╕рд╛рде рдПрдХ рдиреЛрдб рдмрдирд╛рдирд╛
 create (n:Ware {wareId: 1}); 

рд╕рднреА рдиреЛрдбреНрд╕ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ
 MATCH (n) RETURN n; 

рдХрд╛рдЙрдВрдЯрд░
 MATCH (n:Ware {wareId:1}) RETURN "Our graph have "+count(*)+" Nodes with label Ware and wareId=1" as counter; 

2 рд╕рдВрдмрдВрдзрд┐рдд рдиреЛрдб рдмрдирд╛рдПрдВ
 CREATE (n{wareId:1})-[r:SUIT]->(m{criteriaId:1}) 

рд▓рд┐рдВрдХ 2 рдореМрдЬреВрджрд╛ рдиреЛрдбреНрд╕
 MATCH (a {wareId: 1}), (b {criteriaId: 2}) MERGE (a)-[r:SUIT]->(b) 

рд╕рднреА рд╕рдВрдмрдВрдзрд┐рдд рдиреЛрдбреНрд╕ рд╣рдЯрд╛рдПрдБ
 match (n)-[r]-() DELETE n,r; 

рд╕рднреА рдЕрд╕рдВрдмрдВрдзрд┐рдд рдиреЛрдбреНрд╕ рдХреЛ рд╣рдЯрд╛рдПрдВ - рдпрджрд┐ рдЖрдк рдЗрд╕ рдХрдорд╛рдВрдб рдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЪрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╕рдВрдмрдВрдзрд┐рдд рдиреЛрдбреНрд╕ рд╣реИрдВ, рддреЛ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рд╕рдВрдмрдВрдзрд┐рдд рдиреЛрдбреНрд╕ рдХреЛ рдирд┐рдХрд╛рд▓рдирд╛ рд╣реЛрдЧрд╛ред
 match n DELETE n; 

рдорд╛рдкрджрдВрдб 3 рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЙрддреНрдкрд╛рджреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ
 MATCH (a:Ware)-->(b:Criteria {criteriaId: 3}) RETURN a; 

рдПрдХ рдмрд╛рд░ рдХрдИ Cypher рдЖрджреЗрд╢реЛрдВ рдкрд░ рд╡реЗрдм рдХреНрд▓рд╛рдЗрдВрдЯ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИред рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдкреБрд░рд╛рдиреЗ рдЧреНрд░рд╛рд╣рдХ рдХреЛ рдкрддрд╛ рд╣реИ рдХрд┐ рдХреИрд╕реЗ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдРрд╕рд╛ рдЕрд╡рд╕рд░ рдирд╣реАрдВ рдорд┐рд▓рд╛ред рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ 1 рдкрдВрдХреНрддрд┐ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЖрдк рдПрдХ рдЖрджреЗрд╢ рдХреЗ рд╕рд╛рде рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде рдХрдИ рдиреЛрдб рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ рдиреЛрдбреНрд╕ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдирд╛рдо рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЖрдк рд▓рд┐рдВрдХ рдХреЛ рдХреЛрдИ рдирд╛рдо рдирд╣реАрдВ рджреЗ рд╕рдХрддреЗ
 CREATE (w1:Ware{wareId:1})-[:SUIT]->(c1:Criteria{criteriaId:1}), (w2:Ware{wareId:2})-[:SUIT]->(c2:Criteria{criteriaId:2}), (w3:Ware{wareId:3})-[:SUIT]->(c3:Criteria{criteriaId:3}), (w4:Ware{wareId:4})-[:SUIT]->(c1), (w5:Ware{wareId:5})-[:SUIT]->(c1), (w4)-[:SUIT]->(c2), (w5)-[:SUIT]->(c3); 

рдЖрдкрдХреЛ рдРрд╕реА рд╕рдВрд░рдЪрдирд╛ рдорд┐рд▓рддреА рд╣реИред рдпрджрд┐ рдпрд╣ рдЖрдкрдХреЛ рдХрдо рд╕реНрдкрд╖реНрдЯ рджрд┐рдЦрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдорд╛рдЙрд╕ рд╕реЗ рдиреЛрдбреНрд╕ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдкрд░реАрдХреНрд╖рдг рд╕рдВрд░рдЪрдирд╛

рдЗрдВрдЯрд░рдореАрдбрд┐рдПрдЯ Neo4j рд╕реНрдкреАрдб рдЯреЗрд╕реНрдЯ


рдмрдбрд╝реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдФрд░ рд╕рд░рд▓ рдирдореВрдиреЛрдВ рдХреЛ рднрд░рдиреЗ рдХреА рдЧрддрд┐ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреНрд▓реЛрди neo4jphp
 git clone https://github.com/jadell/neo4jphp.git 

рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдореВрд▓ рд╡рд┐рд╡рд░рдг рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ рд╣реИ , рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЙрджрд╛рд╣рд░рдг / test_fill_1.php рдЯреЗрд╕реНрдЯ рдмреЗрд╕ рдХреЛ рдкреЙрдкреНрдпреБрд▓реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреБрд░рдВрдд рдХреЛрдб рдирд┐рдХрд╛рд▓реВрдВрдЧрд╛ред
 <?php use Everyman\Neo4j\Client, Everyman\Neo4j\Index\NodeIndex, Everyman\Neo4j\Relationship, Everyman\Neo4j\Node, Everyman\Neo4j\Cypher; require_once 'example_bootstrap.php'; $neoClient = new Client(); $neoWares = new NodeIndex($neoClient, 'Ware'); $neoCriterias = new NodeIndex($neoClient, 'Criteria'); $neoWareLabel = $neoClient->makeLabel('Ware'); $neoCriteriaLabel = $neoClient->makeLabel('Criteria'); $wareTemplatesCount = 200; //    $criteriasCount = 500; //   $waresCount = 10000; //   $commitWares = 100; //  ,     1 batch $minRelations = 200; //       $maxRelations = 400; //       $time = time(); for($wareTemplateId = 0;$wareTemplateId<$wareTemplatesCount;$wareTemplateId++) { $neoClient->startBatch(); print $wareTemplateId." (".$criteriasCount." criterias, ".$waresCount." wares with rand(".$minRelations.",".$maxRelations.") ..."; $criterias = array(); //   for($criteriaId = 1;$criteriaId <=$criteriasCount;$criteriaId++) { $c = $neoClient->makeNode()->setProperty('criteriaId', $wareTemplateId * $criteriasCount + $criteriaId)->save(); // ->addLabels(array($neoCriteriaLabel)) -    commitBatch $neoCriterias->add($c, 'criteriaId', $wareTemplateId * $wareTemplatesCount + $criteriaId); // ->save()    $criterias[] = $c; } //   for($wareId = 1;$wareId <=$waresCount;$wareId++) { $w = $neoClient->makeNode()->setProperty('wareId', $wareTemplateId * $waresCount + $wareId)->save(); // ->addLabels(array($neoWareLabel)) -    commitBatch $neoWares->add($c, 'wareId', $wareTemplateId * $waresCount + $criteriaId); //        for($i = 1;$i<=rand($minRelations,$maxRelations);$i++) { $w->relateTo($criterias[array_rand($criterias)], "SUIT")->save(); } if(($wareId % $commitWares) == 0) { // ,     Neo4j  $neoClient->commitBatch(); print " [commit ".$commitWares." ".(time() - $time)." sec]"; $time = time(); $neoClient->startBatch(); } } $neoClient->commitBatch(); print " done in ".(time() - $time)." seconds\n"; $time = time(); } 


рдореИрдВрдиреЗ рд░рд╛рдд рдХреЗ рд▓рд┐рдП рдЖрдзрд╛рд░ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЫреЛрдбрд╝ рджреАред рд▓рдЧрднрдЧ 4 рдШрдВрдЯреЗ рдХреЗ рдмрд╛рдж, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдиреЗ рдбреЗрдЯрд╛ рдЬреЛрдбрд╝рдирд╛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдФрд░ Neo4j рд╕реЗрд╡рд╛ рдиреЗ рд╕рд░реНрд╡рд░ рдХреЛ 100% рд▓реЛрдб рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред рд╕реБрдмрд╣, рдХрд╛рдо рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, 8 рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рдорд╛рдиреЛрдВ рдореЗрдВ рд╕реЗ 78,300 рдЙрддреНрдкрд╛рдж рдбрд╛рд▓реЗ рдЧрдПред
рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рдкрд░реАрдХреНрд╖рдг рднрд░рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдо 200-400 рдХрдиреЗрдХреНрд╢рди рдХреЗ рд╕рд╛рде рд▓рдЧрднрдЧ 20 рдЙрддреНрдкрд╛рдж рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рд╣реИрдВред рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ - рдореИрд╕рд┐рдХреЗрд▓ рдФрд░ рдХреИрд╕реЗрдВрдбреНрд░рд╛ рдиреЗ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб (10 рдлрд╝реАрд▓реНрдб, 1 рдкреНрд░рд╛рдердорд┐рдХ рд╕реВрдЪрдХрд╛рдВрдХ, 1 рд╕реВрдЪрдХрд╛рдВрдХ) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ 10-20 рд╣рдЬрд╛рд░ рдЖрд╡реЗрд╖рдг рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдЧрддрд┐ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ - рд╣рдо рдЙрддреНрдкрд╛рдж рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдбреЗрдЯрд╛ рдЧреНрд░рд╛рдл рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдбреЗрдЯрд╛ рд╕реИрдВрдкрд▓рд┐рдВрдЧ рдХреА рдЧрддрд┐ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред

рдбрд┐рд╕реНрдХ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдЖрдХрд╛рд░ 1781 рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рд╣реИред рдпрд╣ 78,300 рдЙрддреНрдкрд╛рджреЛрдВ, 4,000 рдорд╛рдирджрдВрдбреЛрдВ, 156.66 рдорд┐рд▓рд┐рдпрди-31320000 рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛ (рдиреЛрдбреНрд╕ рдФрд░ рд▓рд┐рдВрдХ) 32 рдорд┐рд▓рд┐рдпрди рд╕реЗ рдХрдо рд╣реИ - рдкреНрд░рддрд┐ рдЗрдХрд╛рдИ рдФрд╕рдд 55 рдмрд╛рдЗрдЯреНрд╕ред рдереЛрдбрд╝рд╛ рдмрд╣реБрдд, рдЬреИрд╕рд╛ рдХрд┐ рдореЗрд░реЗ рд▓рд┐рдП рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЦреНрдп рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрднреА рднреА рдирдореВрдиреЛрдВ рдХреА рдЧрддрд┐ рд╣реИ, рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдЖрдХрд╛рд░ рдирд╣реАрдВ рд╣реИред

рдирдореВрдирд╛рдХрд░рдг рдЧрддрд┐ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХрд╛ рдкрд╣рд▓рд╛ рдкреНрд░рдпрд╛рд╕ рд╡рд┐рдлрд▓ рд░рд╣рд╛ - Neo4j рд╕рд░реНрд╡рд░ рдлрд┐рд░ рд╕реЗ "100% рдкреНрд░реЛрд╕реЗрд╕рд░ рд▓реЛрдб рдореЛрдб рдореЗрдВ" рдЪрд▓рд╛ рдЧрдпрд╛ рдФрд░ рдХреБрдЫ рд╣реА рдорд┐рдирдЯреЛрдВ рдореЗрдВ рдЕрдиреБрд░реЛрдз рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рджреАред
 MATCH (c {criteriaId: 1})<--(a)-->(b {criteriaId: 3}) RETURN a.wareId; 

рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ Neo4j рдореЗрдВ рдЕрдиреБрд░реЛрдз рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдкрд╣рд▓реЗ, рдореИрдВ START рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЪрдпрди рдореЗрдВ рдиреЛрдбреНрд╕ рдХреЗ рд╢реБрд░реБрдЖрддреА рд╕реЗрдЯ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛
 START n=node:nodeIndexName(key={value}) MATCH (c)<--(a)-->(b) RETURN a.wareId; 

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред Neo4j рдореЗрдВ рдореБрдЭреЗ рд╡рд░реНрддрдорд╛рди рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреА рд╕реВрдЪреА рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдорд╛рдВрдб рдирд╣реАрдВ рдорд┐рд▓реА, рд▓реЗрдХрд┐рди Neo4j рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЖрдк рдХрдорд╛рдВрдб рдЯрд╛рдЗрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
 :schema 

рдЖрдк рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдЗрдВрдбреЗрдХреНрд╕ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ
 CREATE INDEX ON :Criteria(criteriaId) 

рдЯреАрдо рджреНрд╡рд╛рд░рд╛ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рд╕реВрдЪрдХрд╛рдВрдХ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
 CREATE CONSTRAINT ON (n:Criteria) ASSERT n.criteriaId IS UNIQUE; 

рдКрдкрд░ рджрд┐рдП рдЧрдП рдЖрджреЗрд╢реЛрдВ рджреНрд╡рд╛рд░рд╛ рдЬреЛрдбрд╝реЗ рдЧрдП рдЕрдиреБрдХреНрд░рдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ START рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрдирдХрд╛ рджрд╛рд╡рд╛ рд╣реИ рдХрд┐ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдЬрд╣рд╛рдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
Cypher рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрдирд╛рдП рдЧрдП рдЗрдВрдбреЗрдХреНрд╕ рдХреЛ рд╕реНрдХреАрдорд╛ рдЗрдВрдбреЗрдХреНрд╕ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ START рдХреНрд▓рд╛рдЬ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред START рдХреНрд▓реЙрдЬрд╝ рдЗрдВрдбреЗрдХреНрд╕ рд▓реБрдХрдЕрдк рдЙрди рд╡рд┐рд░рд╛рд╕рдд рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдЖрд░рдХреНрд╖рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рдЬреЛ рдЖрдк рдСрдЯреЛрдЗрдВрдбреЗрдХреНрд╕рд┐рдВрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдпрд╛ рдЧреИрд░-рд╕рд╛рдЗрд░рдлрд╛рдЗ рдПрдкреАрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрдирд╛рддреЗ рд╣реИрдВред

рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП: рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реВрдЪрдХрд╛рдВрдХ, рдЖрдк рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

рдореИрдЪ n: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛
рдЬрд╣рд╛рдБ n.name = "aapo"
рд╡рд╛рдкрд╕реА n;

рдпрджрд┐ рдореИрдВ рдкреНрд░рд▓реЗрдЦрди рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ, рддреЛ рдЖрдк START рдХреЗ рдмрдЬрд╛рдп WHERE рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
START рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИред рдпрджрд┐ рдЖрдк рд╕реНрдкрд╖реНрдЯ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдмрд┐рдВрджреБ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рд╛рдЗрдлреЛрд░ рдЖрдкрдХреА рдХреНрд╡реЗрд░реА рд╕реЗ рд╢реБрд░реБрдЖрддреА рдмрд┐рдВрджреБрдУрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдЧрд╛ рдФрд░ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдПрдЧрд╛ред рдпрд╣ рдиреЛрдб рд▓реЗрдмрд▓реНрд╕ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреА рдХреНрд╡реЗрд░реА рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдЕрдзреНрдпрд╛рдп 14, рд╕реНрдХреАрдорд╛ рджреЗрдЦреЗрдВред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд▓реАрдЧреЗрд╕реА рдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╕реНрдЯрд╛рд░реНрдЯ рдХреНрд▓реЙрдЬ рдХреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрд░реВрд░рдд рд╣реЛрддреА рд╣реИред

рддреЛ рдкрд╣рд▓рд╛ рдХрд╛рдо рдЕрдиреБрд░реЛрдз рдкреИрджрд╛ рд╣реБрдЖ рдерд╛
 MATCH (a:Ware)-->(c1:Criteria {criteriaId: 3}),(c2:Criteria {criteriaId: 1}),(c3:Criteria {criteriaId: 2}) WHERE (a)-->(c2) AND (a)-->(c3) RETURN a; 

рд╣рдорд╛рд░реЗ рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдХреЛрдИ рдЗрдВрдбреЗрдХреНрд╕ рдирд╣реАрдВ рдорд┐рд▓рд╛, рдЗрд╕рд▓рд┐рдП рд╣рдо рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдПрдХ рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдирд╛рдПрдВрдЧреЗред рдореБрдЭреЗ Neo4j рдореЗрдВ рд╕реНрд╡рддрдВрддреНрд░ рдбреЗрдЯрд╛ рд╕реЗрдЯ (MySQL рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ) рдмрдирд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдирд╣реАрдВ рдорд┐рд▓реАред рдЗрд╕рд▓рд┐рдП, рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рд╕рд┐рд░реНрдл Neo4j рд╕рдореБрджрд╛рдп (рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реНрдерд╛рди) рдХреА рд╕реЗрдЯрд┐рдВрдЧ рдореЗрдВ рдбреЗрдЯрд╛ рд╕реНрдЯреЛрд░ рдХрд╛ рдкрде рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛

Neo4j рдореЗрдВ рдЙрдкрдпреЛрдЧ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рд▓рд┐рдП рдкрде рдХреЛ рдмрджрд▓рдХрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

рдЪреМрдХрд╕ рдкрд╛рдардХреЛрдВ рдХреЛ test_fill_1.php рдХреЛрдб рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдХреБрдЫ рдЬреЛрдбрд╝реЗ рдорд┐рд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН
  $c = $neoClient->makeNode()->setProperty('criteriaId', $wareTemplateId * $criteriasCount + $criteriaId)->save(); // ->addLabels(array($neoCriteriaLabel)) -    commitBatch $neoCriterias->add($c, 'criteriaId', $wareTemplateId * $wareTemplatesCount + $criteriaId); // ->save()    

Neo4jphp рдореЗрдВ рдмреИрдЪ рдореЛрдб рдореЗрдВ, рдореИрдВ рдиреЛрдбреНрд╕ рдореЗрдВ рд▓реЗрдмрд▓ рдирд╣реАрдВ рдЬреЛрдбрд╝ рд╕рдХрд╛ рдФрд░ рдХрд┐рд╕реА рдХрд╛рд░рдгрд╡рд╢ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдХреЛ рд╕рд╣реЗрдЬрд╛ рдирд╣реАрдВ рдЧрдпрд╛ред рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ Cypher рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдЪреАрдиреА рдкрддреНрд░ рдирд╣реАрдВ рд░рд╣ рдЧрдпрд╛ рд╣реИ, рдореИрдВрдиреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдХрдЯреНрдЯрд░ - рдкреНрдпреЛрд░ Cypher рдкрд░ рднрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рддреЛ рдпрд╣ test_fill_2.php рдирд┐рдХрд▓рд╛
 <?php use Everyman\Neo4j\Client, Everyman\Neo4j\Index\NodeIndex, Everyman\Neo4j\Relationship, Everyman\Neo4j\Node, Everyman\Neo4j\Cypher; require_once 'example_bootstrap.php'; $neoClient = new Client(); $wareTemplatesCount = 100; //    $criteriasCount = 50; //   $waresCount = 250; //   $minRelations = 20; //       $maxRelations = 40; //       if($maxRelations > $criteriasCount) { throw new \Exception("maxRelations[".$maxRelations."] should be bigger, that criteriasCount[".$criteriasCount."]"); } $query = new Cypher\Query($neoClient, "CREATE CONSTRAINT ON (n:Criteria) ASSERT n.criteriaId IS UNIQUE;", array()); $result = $query->getResultSet(); $query = new Cypher\Query($neoClient, "CREATE CONSTRAINT ON (n:Ware) ASSERT n.wareId IS UNIQUE;", array()); $result = $query->getResultSet(); for($wareTemplateId = 0;$wareTemplateId<$wareTemplatesCount;$wareTemplateId++) { $time = time(); $queryTemplate = "CREATE "; print $wareTemplateId." (".$criteriasCount." criterias, ".$waresCount." wares with rand(".$minRelations.",".$maxRelations.") ..."; $criterias = array(); for($criteriaId = 1;$criteriaId <=$criteriasCount;$criteriaId++) { //      (w1:Ware{wareId:1}) $cId = $criteriaId + $criteriasCount*$wareTemplateId; $queryTemplate .= "(c".$cId.":Criteria{criteriaId:".$cId."}), "; $criterias[] = $cId; } for($wareId = 1;$wareId <=$waresCount;$wareId++) { $wId = $wareId + $waresCount*$wareTemplateId; //      (w1:Ware{wareId:1}) $queryTemplate .= "(w".$wId.":Ware{wareId:".$wId."}), "; //       (w1)-[:SUIT]->(c1) $possibleLinks = array_merge(array(), $criterias); // clone $criterias   for($i = 1;$i<=rand($minRelations,$maxRelations);$i++) { $linkId = $possibleLinks[array_rand($possibleLinks)]; unset($possibleLinks[$linkId]); $queryTemplate .= "w".$wId."-[:SUIT]->c".$linkId.", "; } } $queryTemplate = substr($queryTemplate,0,-2); //   ", " $build = time(); $query = new Cypher\Query($neoClient, $queryTemplate, array()); // $queryTemplate    42   10000 , 500 , 200-400   - $result = $query->getResultSet(); print " Query build in ".($build - $time)." seconds, executed in ".(time() - $build)." seconds\n"; // die(); } 

рдкрд╣рд▓реЗ рдЕрд╡рддрд╛рд░ рдореЗрдВ рдбреЗрдЯрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЧрддрд┐ рдЕрдиреБрдорд╛рдирд┐рдд рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХ рдереАред
30,000 рдиреЛрдбреНрд╕ рдФрд░ 500,000 - 1,000,000 рдХрдиреЗрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдиреЗ рд╕рд╛рдЗрдмрд░рдлреЛрд░ рдкрд░ 140 рд╕реЗрдХрдВрдб рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛, рдбреЗрдЯрд╛рдмреЗрд╕ рдиреЗ 62 рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рдбрд┐рд╕реНрдХ рд╕реНрдерд╛рди рд▓рд┐рдпрд╛ред рдЬрдм рдореИрдВрдиреЗ $ waresCount = 1000 (10,000 рдЙрддреНрдкрд╛рджреЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) рдХреЗ рд╕рд╛рде рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рддреЛ рдореБрдЭреЗ "рд╕реНрдЯреИрдХ рдУрд╡рд░рдлрд╝реНрд▓реЛ рддреНрд░реБрдЯрд┐" рддреНрд░реБрдЯрд┐ рдорд┐рд▓реАред рдореИрдВрдиреЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ред
 MATCH (a {wareId: 1}), (b {criteriaId: 2}) MERGE (a)-[r:SUIT]->(b) 

рдЗрд╕рд╕реЗ рдЧрддрд┐ рдореЗрдВ рдПрдХ рднрдпрд╛рд╡рд╣ рдЧрд┐рд░рд╛рд╡рдЯ рдЖрдИ, рд╕рдВрд╢реЛрдзрд┐рдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдиреЗ рд▓рдЧрднрдЧ рдПрдХ рдШрдВрдЯреЗ рддрдХ рдХрд╛рдо рдХрд┐рдпрд╛ред рдореИрдВрдиреЗ рдХрдИ рдорд╛рдирджрдВрдбреЛрдВ рджреНрд╡рд╛рд░рд╛ рдирдореВрдирд╛ рдЧрддрд┐ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдФрд░ рдмрд╛рдж рдореЗрдВ рддреЗрдЬреА рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЗ рдкреНрд░рд╢реНрди рдкрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯрд╛ред
 <?php use Everyman\Neo4j\Client, Everyman\Neo4j\Index\NodeIndex, Everyman\Neo4j\Relationship, Everyman\Neo4j\Node, Everyman\Neo4j\Cypher; require_once 'example_bootstrap.php'; $neoClient = new Client(); $time = microtime(); $query = new Cypher\Query($neoClient, "MATCH (a:Ware)-->(b:Criteria {criteriaId: 3}),(c:Criteria {criteriaId: 1}),(c2:Criteria {criteriaId: 2}) WHERE (a)-->(c) AND (a)-->(c2) RETURN a;", array()); $result = $query->getResultSet(); print "Done in ".(microtime() - $time)." seconds\n"; 

рдКрдкрд░ рдХреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ 0.02 рд╕реЗрдХрдВрдб рдореЗрдВ рдХрд╛рдо рдХрд░рддреА рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рдХрд╛рдлреА рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИ, рд▓реЗрдХрд┐рди рдорд╛рд▓ рдХреА рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╕рдордп рдиреЛрдбреНрд╕ рдХреЗ рдмреАрдЪ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХрдиреЗрдХреНрд╢рди рдХреИрд╕реЗ рдЬрд▓реНрджреА рд╕реЗ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдмрдиреА рд╣реБрдИ рд╣реИред

рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рдорд╛рдзрд╛рди


рдореИрдВрдиреЗ MySQL рдХреЛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдЬрд╝рдорд╛рдиреЗ рдХреЗ рд▓рд┐рдП "рдореЗрд░реА рдЕрдВрддрд░рд╛рддреНрдорд╛ рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рдиреЗ" рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдмрд┐рдирд╛ рдиреЛрдбреНрд╕ рдХреЗ рдмреАрдЪ рд▓рд┐рдВрдХ рдПрдХ рдЕрд▓рдЧ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред

 CREATE TABLE IF NOT EXISTS `edges` ( `criteriaId` int(11) NOT NULL, `wareId` int(11) NOT NULL, UNIQUE KEY `criteriaId` (`criteriaId`,`wareId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреЗрд╕реНрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ

 <?php mysql_connect("localhost", "root", ""); mysql_select_db("test_nodes"); $wareTemplatesCount = 100; $criteriasCount = 50; $waresCount = 250; $minRelations = 20; $maxRelations = 40; $time = time(); for($wareTemplateId = 0;$wareTemplateId<$wareTemplatesCount;$wareTemplateId++) { $criterias = array(); for($criteriaId = 1;$criteriaId <=$criteriasCount;$criteriaId++) { $criterias[] = $wareTemplateId * $criteriasCount + $criteriaId; } for($wareId = 1;$wareId <=$waresCount;$wareId++) { $edges = array(); $wId = $wareTemplateId * $waresCount + $wareId; $links = array_rand($criterias,rand($minRelations,$maxRelations)); foreach($links as $linkId) { $edges[] = "(".$criterias[$linkId].",".$wareId.")"; } //        mysql_query("INSERT INTO edges VALUES ".implode(",",$edges)); } print "."; } print " [added ".$wareTemplatesCount." templates in ".(time() - $time)." sec]"; $time = time(); 

рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рднрд░рдиреЗ рдореЗрдВ 12 рд╕реЗрдХрдВрдб рдХрд╛ рд╕рдордп рд▓рдЧрд╛ред рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдЖрдХрд╛рд░ 37 рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рд╣реИред 2 рдорд╛рдкрджрдВрдб рд╕реЗ рдЦреЛрдЬ рдХрд░рдиреЗ рдкрд░ 0.0007 рд╕реЗрдХрдВрдб рд▓рдЧрддреЗ рд╣реИрдВ

 SELECT e1.wareId FROM `edges` AS e1 JOIN edges AS e2 ON e1.wareId = e2.wareId WHERE e1.criteriaId =17 AND e2.criteriaId =31 


рдПрдХ рдФрд░ рд╡рд┐рдХрд▓реНрдк


Mysql рдХреЗ рддрд╣рдд рдПрдХ рдкреВрд░реНрдг рдЧреНрд░рд╛рдлрд╝ рдбреЗрдЯрд╛ рд╡реЗрдпрд░рд╣рд╛рдЙрд╕ рд╣реИ - рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдкреНрд░рд▓реЗрдЦрди рджреНрд╡рд╛рд░рд╛ рджреЗрдЦрддреЗ рд╣реБрдП, рдпрд╣ Neo4j рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЖрджрд┐рдо рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖


Neo4j рдПрдХ рдмрд╣реБрдд рд╣реА рд╢рд╛рдВрдд рдЪреАрдЬ рд╣реИ ред Neo4j рдореЗрдВ "рд╕рдВрдЧреАрддрдХрд╛рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦреЗ рдЧрдП рд╕рд╛рдЙрдВрдбрдЯреНрд░реИрдХ рдЬреИрд╕реА рдлрд┐рд▓реНрдореЛрдВ рдореЗрдВ рдЕрднрд┐рдирдп рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдлрд┐рд▓реНрдо рдЕрднрд┐рдиреЗрддрд╛рдУрдВ рдХреЛ рдкрд╕рдВрдж рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рдВрдкрд░реНрдХреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХрд╛ рдЕрдиреБрд░реЛрдз" Neo4j рдореЗрдВ рддреБрдЪреНрдЫ рд░реВрдк рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдХреБрдЫ рдЗрд╕ рддрд░рд╣
 MATCH (me:User {userId:123})-[:Like]->(musicants:User)-[:Author]->(s:Soundtrack)-[:Used]->(f:Film)<-[:Starred]-(actor: User)<-[:Like]-(u:User) RETURN u 

SQL рдХреЗ рд▓рд┐рдП, рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкрд░реЗрд╢рд╛рдиреА рд╡рд╛рд▓рд╛ рдХрд╛рдо рд╣реИред

MySQL рдореЗрдВ рдирдВрдЧреЗ рд╕реВрдЪрдХрд╛рдВрдХ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд╕рд╛рде рдкреВрд░реНрдг рдЧреНрд░рд╛рдлрд╝ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рддреБрд▓рдирд╛ рдХрд░рдирд╛ рдЧрд▓рдд рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ, Neo4j рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдХреЛрдИ рд▓рд╛рдн рдирд╣реАрдВ рд╣реБрдЖ ред

рдЕрджреНрдпрддрдиред рдЪрд┐рддреНрд░реЛрдВ рдХреЗ рдпреВрдЖрд░рдПрд▓ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЙрдиреНрд╣реЗрдВ рд╕рднреА рдХреЛ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЕрджреНрдпрддрди реи ред рдЙрдиреНрд╣реЛрдВрдиреЗ рдХрдИ рдФрд░ рд╡рд┐рдХрд▓реНрдк рд╕реБрдЭрд╛рдП - MongoDB, elasticsearch, solr, sphinx, OrientDBред рдореИрдВ MongoDB рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ, рдореИрдВ рдкрд░реАрдХреНрд╖рд╛ рдкрд░рд┐рдгрд╛рдо рд╡рд╣реАрдВ рдкрд░ рдкреЛрд╕реНрдЯ рдХрд░реВрдВрдЧрд╛ред

Source: https://habr.com/ru/post/In219441/


All Articles