变边查询

问题描述 投票:0回答:3

谁能用文字解释这个查询是如何工作的?

SELECT * FROM cypher('graph_name', $$
    MATCH p = (actor {name: 'Willam Defoe'})-[:ACTED_IN*2]-(co_actor)
    RETURN relationships(p)
$$) as (r agtype);

光是阅读文档就很混乱,也不是很清楚。

cypher graph-databases apache-age opencypher
3个回答
0
投票

在此匹配查询中,我们使用可变长度边。如果有这样一种情况,你可以说顶点 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'
的任何顶点的所有路径都将被匹配

希望对您有所帮助!


0
投票

在此查询中,这意味着您想要获得电影中

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
.


0
投票

它找到所有具有的路径:

  • 在一端,一个具有
    name
    属性的节点,其值为“William Defoe”,
  • 在另一端,任何节点,
  • 和2个连续的
    ACTED_IN
    关系(由任何节点分隔)之间。

关系的方向性未指定,因此方向性无关紧要。节点标签也未指定,因此节点的标签方式无关紧要。而且您应该知道,数据库总是会忽略

MATCH
相同关系出现不止一次的结果。

然后查询为每条路径返回每条路径中的 (2) 个关系的列表,从连接到“William Defoe”节点的那个开始。

© www.soinside.com 2019 - 2024. All rights reserved.