postgresql Apache AGE - MATCH子句和边的方向

ymdaylpp  于 2023-03-01  发布在  PostgreSQL
关注(0)|答案(4)|浏览(234)

我在试验MATCH子句时注意到一个不寻常的方面。这里我在顶点之间创建了一条有向边,如下所示

SELECT * FROM cypher('university_graph', $$
CREATE ((n: Student {name : "John", bornIn : "USA"})-[e: 
StudiesAt {since : 2020}]->(d: Department {name : "CS"}))
RETURN n, d
$$) AS (n agtype, v agtype);

现在,如果我执行以下AGE查询:

SELECT * FROM cypher('university_graph', $$
MATCH (a)-[e]-(b)
RETURN a.name, e.since, b.name
$$) AS (st_name agtype, st_since agtype, dept_name agtype);

输出如下:

但是如果我把标签加到任何一个顶点上,它会给出正确的边方向。AGE查询是:

SELECT * FROM cypher('university_graph', $$
MATCH (a: Student)-[e]-(b)
RETURN a.name, e.since, b.name
$$) AS (st_name agtype, st_since agtype, dept_name agtype);

输出为:

我已经创建了从Student type顶点到Department顶点的有向边,为什么MATCH子句不考虑边的方向(当标签没有添加到顶点时)?这是MATCH子句的有意特性吗?如果是,原因是什么?

iovurdzv

iovurdzv1#

由于Student和Department都具有name属性,并且查询没有指定方向或标签,因此

MATCH (a)-[e]-(b)

可以是任何一种方式。它可以是学生-[关系]-系或系-[关系]-学生。
因此,考虑到查询的二义性,返回的两个结果都是完全有效的。
如果将查询修改为

MATCH (a:Student)-[e]-(b:Department)
RETURN a.name, e.since, b.name

你会得到你想要的结果。

3duebb1j

3duebb1j2#

您的问题与此问题类似。请检查此问题,它可能会解决您的查询。similar situation

6tdlim6h

6tdlim6h3#

Apache AGE中的MATCH子句:
您可以从here检查
MATCH子句允许你指定Cypher将在数据库中搜索的模式。这是将数据放入当前绑定集的主要方式。值得阅读Patterns中更多关于模式本身的规范。
如果在两个顶点之间创建边而不指定方向,AGE会自动创建无向年龄,这意味着可以在任一方向上遍历该边。
在你的第一个查询中你没有指定和标注顶点,现在AGE没有任何关于边方向的信息。然后当你使用MATCH来寻找所有边时,AGE将边视为无向的,并返回传入和郊游的顶点。

xytpbqjk

xytpbqjk4#

如果一个 undirected 关系模式足够模糊,那么MATCH将返回每个匹配关系两次(但是结束节点的顺序相反),因为两个结果都是有效的。
首先,MATCH是最通用的无向关系模式(没有给出结束节点、关系或方向的细节):

MATCH (a)-[e]-(b)

因此,该查询将返回DB中的 * 每个关系 * 两次(但是ab具有相反的值)。

相关问题