±à¼ÍƼö: |
±¾ÎÄÖ÷Òª½éÉÜÁËÀûÓÃSpark
GraphxʵÏÖÁËÒ»¸ö¼òµ¥µÄÁ¬Í¨Í¼ÉçȺ·¢ÏÖʾÀý£¬²¢½«ÉçȺ´æÈ뵽ͼÊý¾Ý¿âNeo4jÖУ¬Í¬Ê±½øÒ»²½½éÉÜÁËNeo4jµÄһЩ¸ÅÄîºÍʹÓã¬×îºóÓÃNeo4jÑÝʾÁËÒ»¸öÉç½»ÍøÂçµÄͼ¼ìË÷ʾÀý¡£
±¾ÎÄÀ´×ÔÓÚ΢ÐÅ£¬ÓÉ»ðÁú¹ûÈí¼þç÷ç÷±à¼¡¢ÍƼö¡£ |
|
ÖйúÓоäÀÏ»°£¬½ÐÎïÒÔÀà¾Û£¬ÈËÒÔȺ·Ö£¬ÔÚ·´×÷±×ºÍÊг¡ÓªÏúµÈÓ¦ÓÃÖУ¬Èç¹ûÎÒÃÇÄܸù¾ÝÓû§¼äµÄijЩÁªÏµ·¢ÏÖÉçȺ£¬È»ºó¶ÔÕâЩÉçȺ½øÐз´×÷±×·ÖÎö»òÉÌÆ·ÍƼö£¬ÍùÍù»áÆðµ½ÒâÏë²»µ½µÄЧ¹û¡£
±¾ÎľÍÀ´½éÉÜÒ»¸ö¼òµ¥µÄÉçȺ·¢ÏÖµÄʵ¼ù¡£¹¹½¨ÉçȺÎÒÃÇÊ×ÏÈÐèÒªÕÒµ½ÉçȺÓû§µÄijÖÖÁªÏµ£¬ÉÏÎÄÌáµ½µÄÊÕͽģʽ±¾Éí¾ÍÊÇÓû§¼äµÄÒ»¸öÌìÈ»ÁªÏµ£¬ÎÒÃÇ¿ÉÒÔ¸ù¾ÝÓû§µÄʦͽ¹ØÏµÀ´¹¹½¨ÉçȺ¡£ÈçÏÂͼËùʾ£¬¸ù¾Ýʦͽ¹ØÏµÎÒÃǹ¹½¨ÁËÒ»¸öÉçȺ£¬µã±íʾÓû§£¬±ß±íʾʦͽ¹ØÏµ¡£

ÓÐÁËÕâÑùµÄÉçȺ֮ºó£¬ÎÒÃǾͿÉÒÔ»ùÓÚÉçȺά¶È·ÖÎöÉ豸¼°Óû§ÐÐΪµÄÒì³££¬±ÈÈçµ¥¸öÉ豸µÇ½¹ý¶àµÄÓû§£¬É豸һֱ´¦ÓÚ³äµç״̬£¬ËùÓÐÓû§ÐÐΪ¸ß¶ÈÒ»Öµȣ¬Í¬Ê±¿ÉÒÔ¼ÆËãÉçȺÓû§×÷±×ÂÊÀ´Í¨¹ýÒÑÖª×÷±×Óû§À´·¢ÏÖеÄ×÷±×Óû§¡£
ÀíÇåÁËÐèÇóÖ®ºóÎÒÃÇ¿ªÊ¼×ÅÊÖ¸ù¾ÝÓû§Ê¦Í½¹ØÏµ¹¹½¨ÉçȺ¡£¶Ô¡°½ôÃÜÁªÏµ¡±µÄ²»Í¬Àí½â²úÉúÁ˺ܶàÉçÇø·¢ÏÖËã·¨¡£ÏÂͼÊǼ¸ÖÖ¾µäµÄÉçȺ·¢ÏÖËã·¨¡£
ÉçȺËã·¨

Triangle Counting£ºÈý½Ç¹ØÏµ£¬Í¼ÂÛ»ù´¡ÖªÊ¶¡£
Connected Components£ºÁ¬Í¨Í¼£¬Í¼ÂÛ»ù´¡ÖªÊ¶¡£
Strongly Connected Components£ºÇ¿Á¬Í¨Í¼£¬Í¼ÂÛ»ù´¡ÖªÊ¶¡£
Label Propagation£º±êÇ©´«²¥Ëã·¨¡£
Louvain£ºÒ»ÖÖ»ùÓÚ¡°Ä£¿é¶È¡±µÄ¾µäËã·¨¡£
ÒòΪ±¾ÎÄÖØµã²»Êǽ²ÊöÉçȺ·¢ÏÖËã·¨£¬ËùÒÔÕâ¸öËã·¨¾ßÌåµÄº¬Òå´Ë´¦ÂÔ¹ý£¬ÓиÐÐËȤµÄ¶ÁÕß¿É×ÔÐÐÑо¿¡£±¾ÎÄÑ¡ÓÃÁË×î¼òµ¥µÄÁ¬Í¨Í¼Ëã·¨À´ÊµÏÖÉçȺ·¢ÏÖ£¬¼´Ö»ÒªÁ½¸ö½ÚµãÖ®¼äÓбßÎÒÃǾͰÑËüÃǹéÊôΪһ¸öÉçȺ¡£ÏÂÃæÎÒÃǽøÈë¸ù¾ÝÓû§Ê¦Í½¹ØÏµÉú³ÉÉçȺ½×¶Î¡£
Spark Graphx¹¹½¨ÉçȺ
Spark Graphx±¾Éí¾ÍÌṩÁ˹¹½¨Í¼²¢Éú³ÉÁ¬Í¨Í¼µÄ½Ó¿Ú£¬ÎÒÃÇÖ»ÐèÒª°´ÒªÇóÊäÈëÊý¾Ý¾ÍºÃÁË¡£ÈçÏÂͼËùʾ£º

ÎÒÃǹ¹½¨µãºÍ±ß£¬È»ºóµ÷ÓÃGraphx½Ó¿ÚÉú³Éͼ£¬×îºóµ÷ÓÃͼµÄ½Ó¿ÚÖ±½Ó»ñÈ¡Á¬Í¨Í¼¡£ÐèҪעÒâµÄÊÇ£¬Spark Graphx¹¹½¨µãºÍ±ßʱ£¬idÐèÒªÓÃLongÀàÐ͵ÄÊý×Ö±íʾ£¬ËùÒÔÎÒÃÇÐèҪά»¤Ò»ÕÅÓû§idµ½Êý×ÖidµÄά±í¡£
//¹¹½¨Óû§½Úµã
val users: RDD[(VertexId, String)] =
spark.sparkContext.parallelize(Array((3L, "u3"),
(7L, "u7"),(5L, "u5"), (2L,
"u2"), (4L, "u4"),(6L, "u6"),(8L,
"u8")))
//¹¹½¨Óû§±ß
val relationships: RDD[Edge[String]] =
spark.sparkContext.parallelize(Array(Edge(7L,
3L,""), Edge(5L, 3L,""),Edge(5L,
2L,""), Edge(6L, 4L,""),Edge(8L,
6L,"")))
//×éºÏ½ÚµãºÍ±ß¹¹½¨Í¼
val graph = Graph(users, relationships)
//´ÓͼÖгéÈ¡³öÁ¬Í¨Í¼
val components = graph.connectedComponents()
//»ñÈ¡Á¬Í¨Í¼Öеĵ㣬verticesÊÇÒ»¸ötupleÀàÐÍ£¬ key·Ö±ðΪËùÓеĶ¥µãid£¬ valueΪkeyËùÔÚµÄÁ¬Í¨Í¼id(Á¬Í¨Í¼Öж¥µãid×îСֵ)
val vertices = components.vertices |
µÃµ½µÄverticesÊÇÈçϵÄk-vÊý¾Ý£º
/**
* vertices£º
* (6,4)
* (8,4)
* (3,2)
* (7,2)
* (5,2)
*
* ÊÇÒ»¸ötupleÀàÐÍ£¬key·Ö±ðΪËùÓеĶ¥µãid£¬ valueΪkeyËùÔÚµÄÁ¬Í¨Í¼id(Á¬Í¨Í¼Öж¥µãid×îСֵ)
*/ |
GraphStream: ÓÃÓÚ»³öÍøÂçͼ
BreezeViz: Óû§»æÖÆÍ¼µÄ½á¹¹»¯ÐÅÏ¢, ±ÈÈç¶ÈµÄ·Ö²¼.
È»ºóÎÒÃǽ«±ßrelationshipsÓëverticesÇó³öÿÌõ±ßËùÔÚÁ¬Í¨Í¼Àï¶¥µãid×îСֵ¡£
val result =
relationships.map(x =>{
(x.srcId,x.dstId.toString)
}).join(vertices)
.map(y =>{
// (7,(3,2)) => (2,(7,3))
(y._2._2,(y._1,y._2._1))
}) |
ÎÒÃǽ«½á¹û´æÈëͼÊý¾ÝNeo4j£¬¿ÉÊÓ»¯ºóÈçÏÂËùʾ£¬¿ÉÒÔ¿´µ½ÎÒÃǵõ½ÁËÁ½¸öÉçȺ¡£

ÖÁ´Ë£¬ÎÒÃÇÀûÓÃSpark Graphx¹¹½¨³öÁËÉçȺ£¬Ã¿¸öÉçȺ¶¼ÓÐ×Ô¼ºµÄÒ»¸öÉçȺid£¬È»ºóÎÒÃǾͿÉÒÔ»ùÓÚÉçȺ×öһЩ¾ßÌå·ÖÎöÁË£¬±ÈÈ磬ÎÒ¿ÉÒÔ¼ÆËãÉçȺ×÷±×ÂÊ£¬²¢È¡³öTOP NµÄÉçȺ£¬ÈçÏÂËùʾ¡£ 
ÉÏÃæÖ»ÊÇÒ»¸ö¼òµ¥µÄʾÀý£¬ÆäʵÎÒÃÇ¿ÉÒÔ¸øµãºÍ±ß¼ÓÉϸü¶àµÄÊôÐÔ£¬ÀûÓÃͼµÄÌØÐÔ½øÐмìË÷£¬¿ÉÒÔ¸ü¸ßЧµÄ¼ìË÷³ö¸ü¶àµÄÐÅÏ¢¡£ÎªÁ˸ü·½±ãµÄ´æ´¢ºÍ²éѯÉçȺÄÚµÄÊý¾Ý£¬ÎÒÃÇ¿ÉÒÔ½«ÉçȺ´æ´¢µ½Í¼Êý¾Ý¿âNeo4j¡£ÉÏÃæµÄÉçȺͼ¾ÍÊÇÓÃNeo4jչʾµÄ£¬ÄÇôʲôÊÇNeo4jÄØ£¿ÏÂÃæÎÒÃǼòµ¥µÄ½éÉÜÏ¡£
Neo4j¼ò½é
Neo4jÊÇÒ»¸öǶÈëʽµÄ¡¢»ùÓÚ´ÅÅ̵ġ¢¾ß±¸ÍêÈ«µÄÊÂÎñÌØÐÔµÄͼÊý¾Ý´æ´¢ÒýÇæ¡£×÷ΪͼÊý¾Ý¿â£¬Neo4j×î´óµÄÌØµãÊǹØÏµÊý¾ÝµÄ´æ´¢¡£Í¼Êý¾Ý¿â³ýÁËÄܹ»ÏñÆÕͨµÄÊý¾Ý¿âÒ»Ñù´æ´¢Ò»ÐÐÒ»ÐеÄÊý¾ÝÖ®Í⣬»¹¿ÉÒԺܷ½±ãµÄ´æ´¢Êý¾ÝÖ®¼äµÄ¹ØÏµÐÅÏ¢¡£
ÀýÈ磬¶ÔÓÚÒ»¸öÉç½»ÍøÂçµÄÓû§Êý¾Ý¿â£¬Äã³ýÁËÒª´æ´¢Ã¿¸öÓû§µÄÐÕÃû¡¢ÐÔ±ð¡¢Ï²ºÃÕâЩ»ù±¾ÐÅÏ¢Í⣬Ä㻹ÐèÒª´æ´¢Ò»¸öÓû§ºÍÄÄЩÓû§ÊÇÅóÓÑ£¬ºÍÄĸöÓû§ÊÇÇéÂÂÕâЩ¹ØÏµÊý¾Ý£¬Õâ¸öʱºòNeo4jÕâÑùµÄͼÊý¾Ý¿â¾Í¿ÉÒÔÅÉÉÏÓó¡À²¡£
ͨ¹ýÏÂͼ£¬´ó¼Ò¿ÉÒÔÁ˽âÏÂʲôÊÇͼÊý¾Ý¿âÒÔ¼°Ê²Ã´ÊǹØÏµÊý¾Ý¡£

ÔÚÉÏͼÖУ¬°üº¬Á½¸ö±êǩΪ¡°ÈË¡±µÄÊý¾Ý½Úµã£¬·Ö±ð´ú±íAnnºÍDanÁ½¸öÓû§¡£ÕâÁ½¸öÊý¾Ý½Úµã»¹°üº¬ÐÕÃû¡¢³öÉúµØµÈÊôÐÔÐÅÏ¢£¬ÓÃÓÚ±íʾÁ½¸öÓû§µÄ»ù±¾ÐÅÏ¢£¬¾ÍÈçͬ³£¹æÊý¾Ý¿âÖеÄÁ½ÐÐÊý¾Ý¡£
³ý´ËÖ®Í⣬Á½¸öÊý¾Ý½ÚµãÖ®¼ä»¹°üº¬Á½Ìõ¹ØÏµÊý¾Ý£¬¼´Ann¼Þ¸øÁËDan£¬AnnºÍDanͬ¾Ó¡£ ÀûÓÃÕâЩ¹ØÏµÊý¾Ý£¬Äã¾Í¿ÉÒÔ·½±ãµÄ×÷³ö»ùÓÚ¹ØÏµµÄ²éѯ£¬ÀýÈçÄã¿ÉÒÔ²éѯAnn¸ú˽á»éÁË£¬Õâ¾ÍÊÇͼÊý¾Ý¿âµÄÓÅÊÆ¡£
¿ÉÄÜÓÐÈË»á˵£¬ÉϱßдµÄÕâÖÖ¹ØÏµÊý¾Ý½á¹¹£¬SQLÒ²¿ÉÒÔͨ¹ý¶à±íjoinµÈ·½·¨ÊµÏÖ£¬ÄÇÒªNeo4j»¹ÓÐʲôÓ㿵«±Ï¾¹ÊõÒµÓÐר¹¥£¬¶ÔÓÚ´óÁ¿¡¢¸´ÔӵĹØÏµÊý¾Ý´¦Àí£¬Neo4jÔÚÐÔÄܺÍʹÓ÷½±ã³Ì¶ÈÉ϶¼ÊÇҪԶʤÓÚSQLµÄ¡£Ï±߸ø´ó¼Ò¼òµ¥×ܽáÏÂNeo4jµÄÌØµã¡£
Neo4jµÄÌØµã
ÏñSQLÒ»ÑùµÄ²éѯÓïÑÔcypher
Ëü×ñÑÊôÐÔͼÊý¾ÝÄ£ÐÍ
Ëüͨ¹ýʹÓÃApache LucenceÖ§³ÖË÷Òý
ËüÖ§³ÖUNIQUEÔ¼Êø
Ëü°üº¬Ò»¸öÓÃÓÚÖ´ÐÐcypherÃüÁîµÄUI£ºNeo4jÊý¾Ýä¯ÀÀÆ÷
ËüÖ§³ÖÍêÕûµÄACID£¨Ô×ÓÐÔ£¬Ò»ÖÂÐÔ£¬¸ôÀëÐԺͳ־ÃÐÔ£©¹æÔò
ËüÖ§³Ö²éѯµÄÊý¾Ýµ¼³öµ½JSONºÍXLS¸ñʽ
ËüÌṩÁËREST API£¬¿ÉÒÔ±»Èκαà³ÌÓïÑÔ£¨ÈçJava£¬Spring£¬ScalaµÈ£©·ÃÎÊ
ËüÌṩÁË¿ÉÒÔͨ¹ýÈκÎUI MVC¿ò¼Ü£¨ÈçNode JS£©·ÃÎʵÄJava½Å±¾
ËüÖ§³ÖÁ½ÖÖJava API£ºCypher APIºÍNative Java APIÀ´¿ª·¢JavaÓ¦ÓóÌÐò
Ö§³Ö¸ß¿ÉÓÃÐÔÖ÷´Ó¼¯Èº²¿Êð¡£
CypherÓïÑÔ
CypherÊÇNeo4jµÄͼÐβéѯÓïÑÔ£¬¹Ø¼ü×Ö´óСд²»Ãô¸Ð¡£Óï·¨ºÍSQLºÜÏñ£¬Ñ§ÆðÀ´Ïà¶Ô¼òµ¥¡£
»ù±¾¸ñʽ
MATCHWHERERETURN
ģʽ
() ±íʾ½Úµã
[] ±íʾ¹ØÏµ£¬¹ØÏµÊÇÓÐÏòµÄ£¬Á¬½ÓµÄµã·ÖΪԴµãºÍÄ¿±êµã
{} ±íʾÊôÐÔ£¬Ã¿¸öÊôÐÔͨ¹ýkey:valueµÄÐÎʽ±íʾ£¬¶à¸öÊôÐÔÖ®¼äÓöººÅ¸ô¿ª£¬¹ØÏµÒ²¿ÉÒÔÓÐÊôÐÔ
±êÇ©
ÓÃÀ´±êʶһ¸ö½ÚµãÊôÓÚÄÄÒ»Àà¡£Ò»¸ö½Úµã¿ÉÒÔÓжà¸ö»ò0¸ö±êÇ©¡£±êǩûÓÐÊôÐÔ¡£
node:label1:label2 ͨ¹ýðºÅ¸ø½ÚµãÌí¼Ó±êÇ©,ͨ¹ýðºÅ·Ö¸ô¶à¸ö±êÇ©
»ù±¾µÄÔöɾ¸Ä²é
²åÈëÒ»¸ö½Úµã
CREATE (n:Person {name : 'Andres'});
²åÈëÒ»Ìõ±ß
MATCH (a:Person),(b:Person) WHERE a.name = 'Node
A' AND b.name = 'Node B¡® CREATE (a)-[r:Follow]->(b);
¸üнڵã
MATCH (n:Person { name: 'Andres' }) SET n.name
= 'Taylor';
ɾ³ý½Úµã
MATCH (n:Person { name:'Taylor' }) DETACH DELETE
n;
ɾ³ý±ß
MATCH (a:Person)-[r:Follow]->(b:Person) WHERE
a.name = 'Node A' AND b.name = 'Node B¡® DELETE
r;
²éѯһ¸ö½ÚµãµÄËùÓÐFollow
MATCH (:Person { name:'Taylor' })-[r:Follow]->(Person)
RETURN Person.name;
²éѯһ¸ö½Úµã×î¶Ì·¾¶
MATCH (ms:Person { name:'Node A' }),(cs:Person
{ name:'Node B' }), p = shortestPath((ms)- [r:Follow]-(cs))
RETURN p;
Çå¿ÕÊý¾Ý¿â
MATCH (n) DETACH DELETE n |
Neo4jÊý¾Ýä¯ÀÀÆ÷
ͨ¹ýNeo4jä¯ÀÀÆ÷¾Í¿ÉÒÔÖ±½Ó½øÐÐͼµÄ²éѯ¡£

CypherÑÝʾʾÀý
ÎÒÃÇʹÓÃCypher²éѯÓïÑÔ¶ÔNeo4jÖеÄÒ»¸ö¼ÒÍ¥½øÐн¨Ä££¬°üÀ¨ÄêÁ䣬ÐÔ±ðºÍ¼ÒÍ¥³ÉÔ±Ö®¼äµÄ¹ØÏµµÈ¸öÈËÊôÐÔ¡£ÎÒÃÇ´´½¨ÁËһЩÅóÓÑÀ´À©´óÎÒÃǵÄÉ罻ͼ£¬È»ºóÌí¼Ó¼ü/Öµ¶ÔÀ´Éú³Éÿ¸öÓû§¿´¹ýµÄµçÓ°ÁÐ±í¡£×îºó£¬ÎÒÃDzéѯÁËÎÒÃǵÄÊý¾Ý£¬Ê¹ÓÃͼÐηÖÎöÀ´ËÑË÷Ò»¸öÓû§Ã»Óп´µ½µ«¿ÉÄÜϲ»¶µÄµçÓ°¡£
´´½¨¼ÒÍ¥³ÉÔ±½Úµã¼°¹ØÏµ
CREATE (person:Person
{name: "Steven", age: 45}) RETURN person
CREATE (person:Person {name: "Michael",
age: 16}) RETURN person
CREATE (person:Person {name: "Rebecca",
age: 7}) RETURN person
CREATE (person:Person {name: "Linda",age:40})
RETURN person
MATCH (steven:Person {name: "Steven"}),
(linda:Person {name: "Linda"}) CREATE
(steven)- [:IS_MARRIED_TO]->(linda) return steven,
linda
MATCH (michael:Person {name: "Michael"}),
(rebecca:Person {name: "Rebecca"}) CREATE
(michael)- [:IS_SIBLILNG]->(rebecca) return
michael, rebecca
MATCH (steven:Person {name: "Steven"}),
(michael:Person {name: "Michael"}) CREATE
(steven)-[:HAS_CHILD]->(michael) return steven,
michael
MATCH (steven:Person {name: "Steven"}),
(rebecca:Person {name: "Rebecca"}) CREATE
(steven)-[:HAS_CHILD]-> (rebecca) return steven,
rebecca
MATCH (linda:Person {name: "Linda"}),
(michael:Person {name: "Michael"}) CREATE
(linda)-[:HAS_CHILD]->(michael) return linda,
michael
MATCH (linda:Person {name: "Linda"}),
(rebecca:Person {name: "Rebecca"}) CREATE
(linda)-[:HAS_CHILD]->(rebecca) return linda,
Rebecca |

Ìí¼ÓÅóÓѽڵ㼰¹ØÏµ£¬×é³ÉÉç½»ÍøÂç
MATCH (michael:Person
{name: "Michael"}) CREATE (michael)-[:FRIEND]->(charlie:Person
{name: "Charlie", age: 16}) RETURN michael,
charlie
MATCH (michael:Person {name: "Michael"})
CREATE (michael)-[:FRIEND]->(koby:Person {name:
"Koby"}) RETURN michael, koby
MATCH (michael:Person {name: "Michael"})
CREATE (michael)-[:FRIEND]-> (grant:Person {name:
"Grant"}) RETURN michael, grant
MATCH (rebecca:Person {name: "Rebecca"})
CREATE (rebecca)-[:FRIEND]->(jordyn:Person
{name: "Jordyn"}) RETURN rebecca, jordyn
MATCH (rebecca:Person {name: "Rebecca"})
CREATE (rebecca)-[:FRIEND]->(katie:Person {name:
"Katie"}) RETURN rebecca, katie |

Ìí¼ÓµçÓ°½Úµã¼°¹ØÏµ£¬²¢Ð¯´ø´ò·ÖÊôÐÔ
CREATE (movie:Movie
{title:"Avengers"}) RETURN movie
MATCH (michael:Person {name:"Michael"}),
(avengers:Movie {title:"Avengers"})
CREATE (michael)- [:HAS_SEEN {rating:5}]-> (avengers)
return michael, avengers
CREATE (movie:Movie {title:"Batman"})
RETURN movie
CREATE (movie:Movie {title:"Gone with the
Wind"}) RETURN movie
CREATE (movie:Movie {title:"Spongebob Square
Pants"}) RETURN movie
CREATE (movie:Movie {title:"Avengers 2"})
RETURN movie
MATCH (charlie:Person {name:"Charlie"}),
(movie:Movie {title:"Batman"}) CREATE
(charlie)- [:HAS_SEEN {rating:4}]->(movie) return
charlie, movie
MATCH (charlie:Person {name:"Charlie"}),
(movie:Movie {title:"Gone with the Wind"})
CREATE (charlie)-[:HAS_SEEN {rating:0}]->(movie)
return charlie, movie
MATCH (koby:Person {name:"Koby"}), (movie:Movie
{title:"Batman"}) CREATE (koby)- [:HAS_SEEN
{rating:4}]->(movie) return koby, movie
MATCH (koby:Person {name:"Koby"}), (movie:Movie
{title:"Avengers 2"}) CREATE (koby)-[:HAS_SEEN
{rating:5}]-> (movie) return koby, movie
MATCH (grant:Person {name:"Grant"}),
(movie:Movie {title:"Spongebob Square Pants"})
CREATE (grant)-[:HAS_SEEN {rating:1}]-> (movie)
return grant, movie
MATCH (jordyn:Person {name:"Jordyn"}),
(movie:Movie {title:"Spongebob Square Pants"})
CREATE (jordyn)-[:HAS_SEEN {rating:5}]-> (movie)
return jordyn, movie
MATCH (michael:Person {name: "Michael"})
SET michael.gender = "male" RETURN michael
MATCH (rebecca:Person {name: "Rebecca"})
SET rebecca.gender = "female" RETURN
rebecca
|

×îºóÎÒÃÇͨ¹ýÏÂÃæÓï¾ä²éѯstevenµÄº¢×ÓµÄÄÐÐÔÅóÓÑ¿´¹ý¶øÇÒ´ò·Ö´óÓÚ3·ÖµÄµçÓ°
MATCH (steven:Person
{name:"Steven"})- [:HAS_CHILD]-(child:Person)-[:FRIEND]-(friend:Person)- [hasSeen:HAS_SEEN]-(movie:Movie)
WHERE child.gender = "male" AND hasSeen.rating
> 3 RETURN DISTINCT movie.title |

|