postgresql 两个边缘正在形成关于单定向边的创建

2izufjch  于 2023-03-12  发布在  PostgreSQL
关注(0)|答案(4)|浏览(87)

当我创建一条有向边时,会创建两条边。

我有一个叫staff_details的图,我创建了两个顶点。

第一个顶点:

SELECT *
FROM cypher('staff_details', $$
    CREATE (:Employee {name: 'Geyoung Ha', title: 'Project Lead'})
$$) as (n agtype);

第二个顶点:

SELECT *
FROM cypher('staff_details', $$
    CREATE (:Employee {name: 'Muneeb', title: 'Software Engineer'})
$$) as (n agtype);

在此之后,我创建了一个从顶点-1到顶点-2的有向边:

SELECT *
FROM cypher('staff_details', $$
    MATCH (a:Employee), (b:Employee)
    WHERE a.name = 'Muneeb' AND b.name = 'Geyoung Ha'
    CREATE (a)-[e:supervised_by]->(b)
    RETURN e
$$) as (e agtype);

在此之后,当我看到我的图表中的雇员(顶点)之间的所有边使用:

SELECT * FROM cypher('staff_details', $$
MATCH (:Employee)-[e]-(:Employee)
RETURN e
$$) as (e agtype);

我得到:

{"id": 1125899906842629, "label": "supervised_by", "end_id": 844424930131970, "start_id": 844424930131969, "properties"
: {}}::edge
 {"id": 1125899906842629, "label": "supervised_by", "end_id": 844424930131970, "start_id": 844424930131969, "properties"
: {}}::edge
(2 rows)

为什么我得到了两条相同的边?但我只创建了一条有向边。

2ic8powd

2ic8powd1#

MATCH(a)-[e]-(B)检查给定模式中每个顶点的输入或输出边。
假设有一个像(a)-[e]-〉(B)这样的模式,现在MATCH(a)-[e]-(b)的工作方式是,它将查看顶点'a'是否有任何边'e'从'b'向外或向内,现在它将查看顶点'b'是否有任何边'e'从'a'向外或向内。
在这种情况下,'a'有一个朝向'b'的输出边'e','b'有一个来自'a'的输入边'e'。因此,输出是重复的,只是顶点相对。如果您显示边的开始和结束id,您会注意到这两个结果是相同的,只是顶点在输出中相对。
因此MATCH(:Employee)-[e]-〉(:Employee)将解决您的问题。

noj0wjuj

noj0wjuj2#

实际上只有一条边,但是
最后一个查询MATCH (:Employee)-[e]-(:Employee)搜索传入和传出边,使其看起来重复。
相反,在其中放一个箭头:

MATCH (:Employee)-[e]->(:Employee)
brvekthn

brvekthn3#

未创建两条边。但由于您的查询未指定方向,AGE将给出两个结果,说明两个方向。对于查询

MATCH (:Employee)-[e]-(:Employee)
RETURN e

Muneeb - [superbised_by] - Geyoung Ha和Geyoung Ha - [supervised_by] - Muneeb都是有效的结果.
若要获取定向关系的特定结果,请在查询中指定方向。请尝试以下查询:-

MATCH (:Employee)-[e]->(:Employee)
RETURN e
yqlxgs2m

yqlxgs2m4#

在这里,当您在两个折点之间创建边时,不会创建两条边。相反,当您通过发出MATCH (:Employee)-[e]-(:Employee)查询边时,此查询将检查两个折点的传入边和传出边(因为没有指定用于匹配边缘的方向)。因此,Vertex-1有输出边,而Vertex-2有相同的输入边,因此它会显示两次该边。
{“编号”:1125899906842629,“标签”:“监督人”、“结束标识”:844424930131970,“起始标识”:844424930131969,“属性”:{}}::边缘
边的id、start_id和end_id相同,这确认这是单条边。
如果将边的方向指定为MATCH (:Employee)-[e]->(:Employee),则将检查起始于Vertex-1并终止于Vertex-2的边

相关问题