谁能用文字解释这个查询是如何工作的?
SELECT * FROM cypher('graph_name', $$
MATCH p = (actor {name: 'Willam Defoe'})-[:ACTED_IN*2]-(co_actor)
RETURN relationships(p)
$$) as (r agtype);
光是阅读文档就很混乱,也不是很清楚。
在此匹配查询中,我们使用可变长度边。如果有这样一种情况,你可以说顶点 A(顶点有一个值为 'A' 的属性 'name'),它有一条边和顶点 B,它有一条边和顶点 C
A -> B -> C
这意味着在 A 和 C 之间有一条可变长度的边。要查询这样一条边,您可以制定以下查询:
SELECT * FROM cypher('graph_name', $$
MATCH p = (a: Vertex{name : 'A'})-[e: EDGE]->(b: Vertex{name : 'B'})-[e1: EDGE]->(c: Vertex
{name: 'C'})
RETURN p
$$) AS (path agtype);
它会输出从顶点 A 到 C 的路径(路径只是从一个顶点到另一个顶点的遍历,并将包含所有顶点和连接顶点的边)从顶点 A 到 C 以及它们之间的所有边。
但是,另一种查询这种边缘的方法是使用更紧凑的形式,即
SELECT * FROM cypher('graph_name', $$
MATCH p = (a: Vertex {name : 'A'})-[e: EDGE*2]->(c: Vertex {name : 'C'})
RETURN p
$$) AS (path agtype);
这里
*2
意味着你只想从 A 走 2 条边。
这也输出从顶点 A 到顶点 C 的路径,其中包含两条边和一个从 A 到 C 时所经过的顶点。
对于您给出的查询,您正在匹配从
开始的所有路径(演员{名字:'Willam Defoe'})
结束于
(共同演员)
这意味着所有源自具有属性
name: 'William Defoe'
的任何顶点的所有路径都将被匹配
希望对您有所帮助!
在此查询中,这意味着您想要获得电影中
ACTED_IN
与Willam Defoe
的所有共同演员,并且对于每个共同演员,您想要ACTED_IN
与他们在同一部电影中的演员。
所以,假设
Willam Defoe
在电影M1
和演员A1
和A2
在电影M1
和M2
中表演。
演员
A3
和A4
也出演了电影M2
.
然后查询的输出将包括来自
Willam Defoe
演员和所有合作演员(A1
,A2
)的路径ACTED_IN
同一部电影(M1
)和每个合作演员( A1
,本例中的A2
)我们将得到ACTED_IN
同一部电影(本例中的M2
)的共同演员,即A3
和A4
。
所以,现在所有将包含在这个例子中的路径中的共同演员是
A1
,A2
,A3
,A4
因为A1
和A2
ACTED_IN
是同一部电影 M1
与Willam Defoe
以及A3
和A4
ACTED_IN
同一部电影M2
与A1
和A2
.
它找到所有具有的路径:
name
属性的节点,其值为“William Defoe”,ACTED_IN
关系(由任何节点分隔)之间。关系的方向性未指定,因此方向性无关紧要。节点标签也未指定,因此节点的标签方式无关紧要。而且您应该知道,数据库总是会忽略
MATCH
相同关系出现不止一次的结果。
然后查询为每条路径返回每条路径中的 (2) 个关系的列表,从连接到“William Defoe”节点的那个开始。