当我创建一条有向边时,会创建两条边。
我有一个叫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)
为什么我得到了两条相同的边?但我只创建了一条有向边。
4条答案
按热度按时间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)将解决您的问题。
noj0wjuj2#
实际上只有一条边,但是
最后一个查询
MATCH (:Employee)-[e]-(:Employee)
搜索传入和传出边,使其看起来重复。相反,在其中放一个箭头:
brvekthn3#
未创建两条边。但由于您的查询未指定方向,AGE将给出两个结果,说明两个方向。对于查询
Muneeb - [superbised_by] - Geyoung Ha和Geyoung Ha - [supervised_by] - Muneeb都是有效的结果.
若要获取定向关系的特定结果,请在查询中指定方向。请尝试以下查询:-
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的边