±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚcnblogs£¬±¾ÎÄÖ÷Òª½éÉÜÁËÊôÐÔͼµÄ×é³É²¿·Ö£¬ÊôÐÔͼģÐ͵Ļù±¾¸ÅÄͼÐÎÖбéÀúµÄ·¾¶£¬Neo4jµÄģʽµÈ£¬Ï£ÍûÄܶÔÄúÓÐËù°ïÖú¡£ |
|
ÔÚÉîÈëѧϰͼÐÎÊý¾Ý¿â֮ǰ£¬Ê×ÏÈÀí½âÊôÐÔͼµÄ»ù±¾¸ÅÄî¡£Ò»¸öÊôÐÔͼÊÇÓɶ¥µã£¨Vertex£©£¬±ß£¨Edge£©£¬±êÇ©£¨Lable£©£¬¹ØÏµÀàÐͺÍÊôÐÔ£¨Property£©×é³ÉµÄÓÐÏòͼ¡£¶¥µãÒ²³Æ×÷½Úµã£¨Node£©£¬±ßÒ²³Æ×÷¹ØÏµ£¨Relationship£©£»ÔÚͼÐÎÖУ¬½ÚµãºÍ¹ØÏµÊÇ×îÖØÒªµÄʵÌ壬ËùÓеĽڵãÊǶÀÁ¢´æÔڵģ¬Îª½ÚµãÉèÖñêÇ©£¬ÄÇôӵÓÐÏàͬ±êÇ©µÄ½ÚµãÊôÓÚÒ»¸ö·Ö×飬һ¸ö¼¯ºÏ£»¹ØÏµÍ¨¹ý¹ØÏµÀàÐÍÀ´·Ö×飬ÀàÐÍÏàͬµÄ¹ØÏµÊôÓÚͬһ¸ö¼¯ºÏ¡£¹ØÏµÊÇÓÐÏòµÄ£¬¹ØÏµµÄÁ½¶ËÊÇÆðʼ½ÚµãºÍ½áÊø½Úµã£¬Í¨¹ýÓÐÏòµÄ¼ýÍ·À´±êʶ·½Ïò£¬½ÚµãÖ®¼äµÄË«Ïò¹ØÏµÍ¨¹ýÁ½¸ö·½ÏòÏà·´µÄ¹ØÏµÀ´±êʶ¡£½Úµã¿ÉÓÐÁã¸ö£¬Ò»¸ö»ò¶à¸ö±êÇ©£¬µ«ÊǹØÏµ±ØÐëÉèÖùØÏµÀàÐÍ£¬²¢ÇÒÖ»ÄÜÉèÖÃÒ»¸ö¹ØÏµÀàÐÍ¡£Neo4jͼÐÎÊý¾Ý¿âµÄ²éѯÓïÑÔÊÇCypher£¬ÓÃÓÚ²Ù×÷ÊôÐÔͼ£¬ÊÇͼÐÎÓïÑÔÖÐÊÂʵÉϵıê×¼¡£
Ò»¡¢Í¼ÐÎÊý¾Ý¿âµÄ»ù±¾¸ÅÄî
Neo4j´´½¨µÄͼ£¨Graph£©»ùÓÚÊôÐÔͼģÐÍ£¬ÔÚ¸ÃÄ£ÐÍÖУ¬Ã¿¸öʵÌå¶¼ÓÐID£¨Identity£©Î¨Ò»±êʶ£¬Ã¿¸ö½ÚµãÓɱêÇ©£¨Lable£©·Ö×飬ÿ¸ö¹ØÏµ¶¼ÓÐÒ»¸öΨһµÄÀàÐÍ£¬ÊôÐÔͼģÐ͵Ļù±¾¸ÅÄîÓУº
ʵÌ壨Entity£©ÊÇÖ¸½Úµã£¨Node£©ºÍ¹ØÏµ£¨Relationship£©£»Â·¾¶£¨Path£©ÊÇÖ¸ÓÉÆðʼ½ÚµãºÍÖÕÖ¹½ÚµãÖ®¼äµÄʵÌ壨½ÚµãºÍ¹ØÏµ£©¹¹³ÉµÄÓÐÐò×éºÏ£»
ÿ¸öʵÌå¶¼ÓÐÒ»¸öΨһµÄID£»
ÿ¸öʵÌå¶¼ÓÐÁã¸ö£¬Ò»¸ö»ò¶à¸öÊôÐÔ£¬Ò»¸öʵÌåµÄÊôÐÔ¼üÊÇΨһµÄ£»
ÿ¸ö½Úµã¶¼ÓÐÁã¸ö£¬Ò»¸ö»ò¶à¸ö±êÇ©£¬ÊôÓÚÒ»¸ö»ò¶à¸ö·Ö×飻
ÿ¸ö¹ØÏµ¶¼Ö»ÓÐÒ»¸öÀàÐÍ£¬ÓÃÓÚÁ¬½ÓÁ½¸ö½Úµã£»
±ê¼Ç£¨Token£©ÊǷǿյÄ×Ö·û´®£¬ÓÃÓÚ±êʶ±êÇ©£¨Lable£©£¬¹ØÏµÀàÐÍ£¨Relationship Type£©£¬»òÊôÐÔ¼ü£¨Property
Key£©£»
±êÇ©£ºÓÃÓÚ±ê¼Ç½ÚµãµÄ·Ö×飬¶à¸ö½Úµã¿ÉÒÔÓÐÏàͬµÄ±êÇ©£¬Ò»¸ö½Úµã¿ÉÒÔÓжà¸öLable£¬LableÓÃÓÚ¶Ô½Úµã½øÐзÖ×飻
¹ØÏµÀàÐÍ£ºÓÃÓÚ±ê¼Ç¹ØÏµµÄÀàÐÍ£¬¶à¸ö¹ØÏµ¿ÉÒÔÓÐÏàͬµÄ¹ØÏµÀàÐÍ£»
ÊôÐÔ¼ü£ºÓÃÓÚΨһ±êʶһ¸öÊôÐÔ£»
ÊôÐÔ£¨Property£©ÊÇÒ»¸ö¼üÖµ¶Ô£¨Key/Value Pair£©£¬Ã¿¸ö½Úµã»ò¹ØÏµ¿ÉÒÔÓÐÒ»¸ö»ò¶à¸öÊôÐÔ£»ÊôÐÔÖµ¿ÉÒÔÊDZêÁ¿ÀàÐÍ£¬»òÕâ±êÁ¿ÀàÐ͵ÄÁÐ±í£¨Êý×飩£»
¶þ¡¢Í¼ÐÎʾÀý
ÔÚÏÂÃæµÄͼÐÎÖУ¬´æÔÚÈý¸ö½ÚµãºÍÁ½¸ö¹ØÏµ¹²5¸öʵÌ壻PersonºÍMovieÊÇLable£¬ACTED_IDºÍDIRECTEDÊǹØÏµÀàÐÍ£¬name£¬title£¬rolesµÈÊǽڵãºÍ¹ØÏµµÄÊôÐÔ¡£

ʵÌå°üÀ¨½ÚµãºÍ¹ØÏµ£¬½ÚµãÓбêÇ©ºÍÊôÐÔ£¬¹ØÏµÊÇÓÐÏòµÄ£¬Á´½ÓÁ½¸ö½Úµã£¬¾ßÓÐÊôÐԺ͹ØÏµÀàÐÍ¡£
1£¬ÊµÌå
ÔÚʾÀýͼÐÎÖУ¬°üº¬Èý¸ö½Úµã£¬·Ö±ðÊÇ£º

°üº¬Á½¸ö¹ØÏµ£¬·Ö±ðÊÇ£º
Á½¸ö¹ØÏµÀàÐÍ£ºACTED_INºÍDIRECTED£¬
Á½¸ö¹ØÏµ£ºÁ¬½ÓnameÊôÐÔΪTom Hank½ÚµãºÍMovie½ÚµãµÄ¹ØÏµ£¬Á¬½ÓnameÊôÐÔΪForrest
GumpµÄ½ÚµãºÍMovie½ÚµãµÄ¹ØÏµ¡£
ÆäÖÐÒ»¸ö¹ØÏµÈçÏÂͼ£º

2£¬±êÇ©£¨Lable£©
ÔÚͼÐνṹÖУ¬±êÇ©ÓÃÓÚ¶Ô½Úµã½øÐзÖ×飬Ï൱ÓÚ½ÚµãµÄÀàÐÍ£¬ÓµÓÐÏàͬ±êÇ©µÄ½ÚµãÊôÓÚͬһ¸ö·Ö×é¡£Ò»¸ö½Úµã¿ÉÒÔÓµÓÐÁã¸ö£¬Ò»¸ö»ò¶à¸ö±êÇ©£¬Òò´Ë£¬Ò»¸ö½Úµã¿ÉÒÔÊôÓÚ¶à¸ö·Ö×é¡£¶Ô·Ö×é½øÐвéѯ£¬Äܹ»ËõС²éѯµÄ½Úµã·¶Î§£¬Ìá¸ß²éѯµÄÐÔÄÜ¡£
ÔÚʾÀýͼÐÎÖУ¬ÓÐÁ½¸ö±êÇ©PersonºÍMovie£¬Á½¸ö½ÚµãÊÇPerson£¬Ò»¸ö½ÚµãÊÇMovie£¬±êÇ©ÓеãÏñ½ÚµãµÄÀàÐÍ£¬µ«ÊÇ£¬Ã¿¸ö½Úµã¿ÉÒÔÓжà¸ö±êÇ©¡£

3£¬ÊôÐÔ£¨Property£©
ÊôÐÔÊÇÒ»¸ö¼üÖµ¶Ô£¨Key/Value£©£¬ÓÃÓÚΪ½Úµã»ò¹ØÏµÌṩÐÅÏ¢¡£Ò»°ãÇé¿öÏ£¬Ã¿¸ö½Úµã¶¼ÓÉnameÊôÐÔ£¬ÓÃÓÚÃüÃû½Úµã¡£
ÔÚʾÀýͼÐÎÖУ¬Person½ÚµãÓÐÁ½¸öÊôÐÔnameºÍborn£¬Movie½ÚµãÓÐÁ½¸öÊôÐÔ£ºtitleºÍreleased£¬

¹ØÏµÀàÐÍACTED_INÓÐÒ»¸öÊôÐÔ£ºroles£¬¸ÃÊôÐÔÖµÊÇÒ»¸öÊý×飬¶ø¹ØÏµÀàÐÍΪDIRECTEDµÄ¹ØÏµÃ»ÓÐÊôÐÔ

Èý¡¢±éÀú£¨Traversal£©
±éÀúÒ»¸öͼÐΣ¬ÊÇÖ¸ÑØ×ŹØÏµ¼°Æä·½Ïò£¬·ÃÎÊͼÐεĽڵ㡣¹ØÏµÊÇÓÐÏòµÄ£¬Á¬½ÓÁ½¸ö½Úµã£¬´ÓÆðʼ½ÚµãÑØ×ŹØÏµ£¬Ò»²½Ò»²½µ¼º½£¨navigate£©µ½½áÊø½ÚµãµÄ¹ý³Ì½Ð×ö±éÀú£¬±éÀú¾¹ýµÄ½ÚµãºÍ¹ØÏµµÄÓÐÐò×éºÏ³Æ×÷·¾¶£¨Path£©¡£
ÔÚʾÀýͼÐÎÖУ¬²éÕÒTom Hanks²ÎÑݵĵçÓ°£¬±éÀúµÄ¹ý³ÌÊÇ£º´ÓTom Hanks½Úµã¿ªÊ¼£¬ÑØ×ÅACTED_IN¹ØÏµ£¬Ñ°ÕÒ±êǩΪMovieµÄÄ¿±ê½Úµã¡£
±éÀúµÄ·¾¶Èçͼ£º

ËÄ¡¢Í¼ÐÎÊý¾Ý¿âµÄģʽ
Neo4jµÄģʽ£¨Schema£©Í¨³£ÊÇÖ¸Ë÷Òý£¬Ô¼ÊøºÍͳ¼Æ£¬Í¨¹ý´´½¨Ä£Ê½£¬Neo4jÄܹ»»ñµÃ²éѯÐÔÄܵÄÌáÉýºÍ½¨Ä£µÄ±ãÀû£»Neo4jÊý¾Ý¿âµÄģʽ¿ÉÑ¡µÄ£¬Ò²¿ÉÒÔÊÇÎÞģʽµÄ¡£
1£¬Ë÷Òý
ͼÐÎÊý¾Ý¿âÒ²ÄÜ´´½¨Ë÷Òý£¬ÓÃÓÚÌá¸ßͼÐÎÊý¾Ý¿âµÄ²éѯÐÔÄÜ¡£ºÍ¹ØÏµÐÍÊý¾Ý¿âÒ»Ñù£¬Ë÷ÒýÊÇͼÐÎÊý¾ÝµÄÒ»¸öÈßÓั±¾£¬Í¨¹ý¶îÍâµÄ´æ´¢¿Õ¼äºÍÎþÉüÊý¾Ýд²Ù×÷µÄÐÔÄÜ£¬À´Ìá¸ßÊý¾ÝËÑË÷µÄÐÔÄÜ£¬±ÜÃâ´´½¨²»±ØÒªµÄË÷Òý£¬ÕâÑùÄܹ»¼õÉÙÊý¾Ý¸üеÄÐÔÄÜËðʧ¡£
Neo4jÔÚͼÐνڵãµÄÒ»¸ö»ò¶à¸öÊôÐÔÉÏ´´½¨Ë÷Òý£¬ÔÚË÷Òý´´½¨Íê³ÉÖ®ºó£¬µ±Í¼ÐÎÊý¾Ý¸üÐÂʱ£¬Neo4j¸ºÔðË÷ÒýµÄ×Ô¶¯¸üУ¬Ë÷ÒýµÄÊý¾ÝÊÇʵʱͬ²½µÄ£»ÔÚ²éѯ±»Ë÷ÒýµÄÊôÐÔʱ£¬Neo4j×Ô¶¯Ó¦ÓÃË÷Òý£¬ÒÔ»ñµÃ²éѯÐÔÄܵÄÌáÉý¡£
ÀýÈ磬ʹÓÃCypher´´½¨Ë÷Òý£º
CREATE INDEX
ON :Person(firstname)
CREATE INDEX ON :Person(firstname, surname) |
2£¬Ô¼Êø
ÔÚͼÐÎÊý¾Ý¿âÖУ¬Äܹ»´´½¨ËÄÖÖÀàÐ͵ÄÔ¼Êø£º
½ÚµãÊôÐÔÖµÎ¨Ò»Ô¼Êø£¨Unique node property£©£ºÈç¹û½Úµã¾ßÓÐÖ¸¶¨µÄ±êÇ©ºÍÖ¸¶¨µÄÊôÐÔ£¬ÄÇôÕâЩ½ÚµãµÄÊôÐÔÖµÊÇΨһµÄ
½ÚµãÊôÐÔ´æÔÚÔ¼Êø£¨Node property existence£©£º´´½¨µÄ½Úµã±ØÐë´æÔÚ±êÇ©ºÍÖ¸¶¨µÄÊôÐÔ
¹ØÏµÊôÐÔ´æÔÚÔ¼Êø£¨Relationship property existence£©£º´´½¨µÄ¹ØÏµ´æÔÚÀàÐͺÍÖ¸¶¨µÄÊôÐÔ
½Úµã¼üÔ¼Êø£¨Node Key£©£ºÔÚÖ¸¶¨µÄ±êÇ©ÖеĽڵãÖУ¬Ö¸¶¨µÄÊôÐÔ±ØÐë´æÔÚ£¬²¢ÇÒÊôÐÔÖµµÄ×éºÏÊÇΨһµÄ
ÀýÈ磬ʹÓÃCypher´´½¨Ô¼Êø£º
CREATE CONSTRAINT
ON (book:Book) ASSERT book.isbn IS UNIQUE;
CREATE CONSTRAINT ON (book:Book) ASSERT exists(book.isbn);
CREATE CONSTRAINT ON ()-[like:LIKED]-() ASSERT
exists(like.day);
CREATE CONSTRAINT ON (n:Person) ASSERT (n.firstname,
n.surname) IS NODE KEY; |
3£¬Í³¼ÆÐÅÏ¢
µ±Ê¹ÓÃCypher²éѯͼÐÎÊý¾Ý¿âʱ£¬Cypher½Å±¾±»±àÒë³ÉÒ»¸öÖ´Ðмƻ®£¬Ö´ÐиÃÖ´Ðмƻ®»ñµÃ²éѯ½á¹û¡£ÎªÁËÉú³ÉÒ»¸öÐÔÄÜÓÅ»¯µÄÖ´Ðмƻ®£¬Neo4jÐèÒªÊÕ¼¯Í³¼ÆÐÅÏ¢ÒÔ¶Ô²éѯ½øÐÐÓÅ»¯¡£µ±Í³¼ÆÐÅÏ¢±ä»¯µ½Ò»¶¨µÄ¸³ÖµÊ±£¬Neo4jÐèÒªÖØÐÂÉú³ÉÖ´Ðмƻ®£¬ÒÔ±£Ö¤Cypher²éѯÊÇÐÔÄÜÓÅ»¯µÄ£¬Neo4j´æ´¢µÄͳ¼ÆÐÅÏ¢°üÀ¨£º
The number of nodes with a certain label.
Selectivity per index.
The number of relationships by type.
The number of relationships by type, ending or starting
from a node with a specific label.
ĬÈÏÇé¿öÏ£¬Neo4j×Ô¶¯¸üÐÂͳ¼ÆÐÅÏ¢£¬µ«ÊÇ£¬Í³¼ÆÐÅÏ¢µÄ¸üв»ÊÇʵʱµÄ£¬¸üÐÂͳ¼ÆÐÅÏ¢¿ÉÄÜÊÇÒ»¸ö·Ç³£ºÄʱµÄ²Ù×÷£¬Òò´Ë£¬Neo4jÔÚºǫ́ÔËÐУ¬²¢ÇÒÖ»Óе±±ä»¯µÄÊý¾Ý´ïµ½Ò»¶¨µÄãÐֵʱ£¬²Å»á¸üÐÂͳ¼ÆÐÅÏ¢¡£
Neo4j keeps the statistics up to date in two different
ways. For label counts for example, the number is
updated whenever you set or remove a label from a
node. For indexes, Neo4j needs to scan the full index
to produce the selectivity number. Since this is potentially
a very time-consuming operation, these numbers are
collected in the background when enough data on the
index has been changed.
Neo4j°ÑÖ´Ðмƻ®±»»º´æÆðÀ´£¬ÔÚͳ¼ÆÐÅÏ¢±ä»¯Ö®Ç°£¬Ö´Ðмƻ®²»»á±»ÖØÐÂÉú³É¡£Í¨¹ýÅäÖÃÑ¡ÏNeo4jÄܹ»¿ØÖÆÖ´Ðмƻ®µÄÖØÐÂÉú³É£º
dbms.index_sampling.background_enabled£ºÊÇ·ñÔÚºǫ́ͳ¼ÆË÷ÒýÐÅÏ¢£¬ÓÉÓÚCypher²éѯµÄÖ´Ðмƻ®ÊǸù¾Ýͳ¼ÆÐÅÏ¢Éú³ÉµÄ£¬¼°Ê±¸üÐÂË÷ÒýµÄͳ¼ÆÊý¾Ý¶ÔÉú³ÉÐÔÄÜÓÅ»¯µÄÖ´Ðмƻ®·Ç³£ÖØÒª£»
dbms.index_sampling.update_percentage£ºÔÚ¸üÐÂË÷ÒýµÄͳ¼ÆÐÅϢ֮ǰ£¬Ë÷ÒýÖÐÓжà´ó±ÈÀýµÄÊý¾Ý±»¸üУ»
cypher.statistics_divergence_threshold£ºµ±Í³¼ÆÐÅÏ¢±ä»¯Ê±£¬Neo4j²»»áÁ¢¼´¸üÐÂCypher²éѯµÄÖ´Ðмƻ®£»Ö»Óе±Í³¼ÆÐÅÏ¢±ä»¯µ½Ò»¶¨µÄ³Ì¶Èʱ£¬Neo4j²Å»áÖØÐÂÉú³ÉÖ´Ðмƻ®¡£
|