我在试验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子句的有意特性吗?如果是,原因是什么?
4条答案
按热度按时间iovurdzv1#
由于Student和Department都具有
name
属性,并且查询没有指定方向或标签,因此可以是任何一种方式。它可以是学生-[关系]-系或系-[关系]-学生。
因此,考虑到查询的二义性,返回的两个结果都是完全有效的。
如果将查询修改为
你会得到你想要的结果。
3duebb1j2#
您的问题与此问题类似。请检查此问题,它可能会解决您的查询。similar situation
6tdlim6h3#
Apache AGE中的MATCH子句:
您可以从here检查
MATCH子句允许你指定Cypher将在数据库中搜索的模式。这是将数据放入当前绑定集的主要方式。值得阅读Patterns中更多关于模式本身的规范。
如果在两个顶点之间创建边而不指定方向,AGE会自动创建无向年龄,这意味着可以在任一方向上遍历该边。
在你的第一个查询中你没有指定和标注顶点,现在AGE没有任何关于边方向的信息。然后当你使用MATCH来寻找所有边时,AGE将边视为无向的,并返回传入和郊游的顶点。
xytpbqjk4#
如果一个 undirected 关系模式足够模糊,那么
MATCH
将返回每个匹配关系两次(但是结束节点的顺序相反),因为两个结果都是有效的。首先,
MATCH
是最通用的无向关系模式(没有给出结束节点、关系或方向的细节):因此,该查询将返回DB中的 * 每个关系 * 两次(但是
a
和b
具有相反的值)。