一、专业名词
可以参考https://blog.csdn.net/alex_xfboy/article/details/82970127#3.%20%E4%B8%93%E4%B8%9A%E5%90%8D%E8%AF%8D,图文并茂写的非常好,这里我只是做个人的简单总结。
Node Labels 表示存在的节点
Relationship Types表示存在的关系
Property Keys 表示节点或者关系的属性
二、语法现象
这里我参照官方文档,以及官方手册。登陆http://localhost:7474/browser/,在jump into code中点击按钮,
我们可以看到它包含Create、Find、Query、Solve,这只是笼统的叫法,接下来会有详细的语法规则
1、CREATE
在这个例子中,它创造了许多电影、人物,并赋予人物与电影以关系(出演、导演、编剧等),还有人物与人物的关系(follows关系等),效果如图
示例结束
现在具体讲述CREATE语法规则
先看一个例子
CREATE (:Movie { title:"The Matrix",released:1997 }
我们可以看到它没有返回数据,有一个node(节点),一个label(标签),两个properties(属性)。
+-----------------------+
| No data returned.|
+-----------------------+
Nodes created: 1
Properties set: 2
Labels added: 1
如果我们还想返回创建的数据,我们可以添加一个return子句
CREATE (p:Person { name:"Keanu Reeves", born:1964 })
RETURN p
这是返回的内容
+----------------------------------------+
| p |
+----------------------------------------+
| Node[1]{name:"Keanu Reeves",born:1964} |
+----------------------------------------+
1 row
Nodes created: 1
Properties set: 2
Labels added: 1
当然,我们也可以创建更复杂的结构,比如ACTED_IN与角色信息的关系,或者DIRECTED的直接关系。
CREATE (a:Person { name:"Tom Hanks",
born:1956 })-[r:ACTED_IN { roles: ["Forrest"]}]->(m:Movie { title:"Forrest Gump",released:1994 })
CREATE (d:Person { name:"Robert Zemeckis", born:1951 })-[:DIRECTED]->(m)
RETURN a,d,r,
这里说明一下,Cypher使用一对破折号(--)来表示无向关系。有向关系在一端有一个箭头(<--, -->)。括号内的表达式([…])可用于添加细节。这可能包括变量、属性和类型信息:
形如
-->
-[role]->
-[:ACTED_IN]->
-[role:ACTED_IN]->
-[role:ACTED_IN {roles: ["Neo"]}]->
节点间的关系如图
2、MATCH
要查找到目前为止我们创建的数据,我们可以开始查找标记为Movie label的所有节点。
MATCH (m:Movie)
RETURN m
结果:
我们也可以找一个特定的person,比如Keanu Reeves
MATCH (p:Person { name:"Keanu Reeves" })
RETURN p
此查询返回匹配的节点
我们也可以找到更多有趣的联系,比如Tom Hanks扮演的电影片名和他扮演的角色。
MATCH (p:Person { name:"Tom Hanks" })-[r:ACTED_IN]->(m:Movie)
RETURN m.title, r.roles
+-------------------------------------+
| m.title | r.roles |
+-------------------------------------+
| "Forrest Gump" | ["Forrest"] |
+-------------------------------------+
1 row
现在,我们已经知道如何将新节点连接到现有节点,并且可以结合使用MATCH和CREATE来将结构附加到图中。
3、附加结构(小实例)
为了用新的信息扩展图,我们首先匹配现有的连接点,然后用关系将新创建的节点附加到它们上。加入电影《Cloud Atlas》作为Tom Hanks的新电影可以这样实现:
MATCH (p:Person { name:"Tom Hanks" })
CREATE (m:Movie { title:"Cloud Atlas",released:2012 })
CREATE (p)-[r:ACTED_IN { roles: ['Zachry']}]->(m)
RETURN p,r,m
重要的是要记住,我们可以将变量分配给节点和关系,并在以后使用它们,无论它们是创建的还是匹配的。
可以在一个CREATE子句中附加节点和关系。但是为了可读性,将它们分开会有所帮助。
MATCH和CREATE组合的一个棘手之处是,每个匹配模式都有一行。这将导致后续的CREATE语句对每一行执行一次。在很多情况下,这就是你想要的。
如果不打算这样做,请在匹配之前移动CREATE语句,或者使用后面讨论的方法更改查询的基数,或者使用下一个子句的get或CREATE语义的:MERGE。
4、MERGE
merge可以看成是match和create的合体,留着下次再讲。