postgresql 使用OpenCypher和Apache AGE创建两个顶点之间的双向关系

lndjwyie  于 2023-04-29  发布在  PostgreSQL
关注(0)|答案(3)|浏览(165)

在下面的例子中,我创建了两个顶点之间的单向关系(从b到a),有没有一种方法可以同时创建从(a到b)的关系?

SELECT *
FROM cypher('test_graph', $$
    MATCH (a:Person), (b:Person) WHERE a.name = 'hossam' AND b.name = 'omar'
    CREATE (b)-[r:REL {name: b.name+'->'+a.name}]->(a) RETURN r
$$) as (v agtype);

我尝试删除箭头符号**〉***********,如:CREATE (b)-[r:REL {name: b.name+'->'+a.name}]-(a),但它会导致语法错误。

kb5ga3dv

kb5ga3dv1#

到目前为止,我认为实现双向关系最直接的方法是将其设置为属性,你不能在创建时删除方向。例如:

SELECT * FROM cypher ('graph', $$
MATCH (a:Person), (b:Person)
WHERE a.name = "hossam" AND b.name = "omar"
CREATE (a)-[e:FRIENDS]-(b)
RETURN e
$$) as (e agtype);

这将返回你说的错误

ERROR:  only directed relationships are allowed in CREATE
LINE 4: CREATE (a)-[e:FRIENDS]-(b)

如果你使用双向边缘

SELECT * FROM cypher ('graph', $$
MATCH (a:Person), (b:Person)
WHERE a.name = "hossam" AND b.name = "omar"
CREATE (a)<-[e:FRIENDS]->(b)
RETURN e
$$) as (e agtype);
ERROR:  syntax error at or near ">"
LINE 4: CREATE (a)<-[e:BORDERS_WITH]->(b)

你需要尝试这样的东西:

SELECT * FROM cypher ('graph', $$
MATCH (a:Person), (b:Person)
WHERE a.name = "hossam" AND b.name = "omar"
CREATE (a)-[e:FRIENDS{ type:"<->" }]->(b)
RETURN e
$$) as (e agtype);

通过将““指定<->为属性,您可以使用以下命令搜索图形中的所有双向关系:

SELECT * FROM cypher ('graph', $$
MATCH (a)-[e:FRIENDS]->(b)
WHERE e.type = "<->"
RETURN e
$$) as (e agtype);

由于双向关系的特性还不被支持,我相信这是解决这个问题的一种方法。

qncylg1j

qncylg1j2#

不可以,在Apache AGE中无法创建双向关系。在Neo4j中也没有办法创建双向关系,正如this question的答案中所写的那样。原因是,既然允许您进行非定向查询,双向关系就变得本质上与完全忽略方向相同。
在技术层面上:
边与顶点start_id和end_id一起存储在边表中。具有双向关系意味着start_id和end_id都需要具有2个值。
你有两个选择:
1.)在相反的方向建立另一个关系(但它需要更多的空间)。
2.)进行非定向查询。

rt4zxlrg

rt4zxlrg3#

一次创建两个关系:

SELECT *                                                                      
FROM cypher('test', $$
    MATCH (a:Person), (b:Person) WHERE a.name = 'hossam' AND b.name = 'omar'
    CREATE br =
    (b)-[r:REL {name: b.name+'->'+a.name}]->(a)<-[r:REL {name: b.name+'<-'+a.name}]-(b)
    RETURN br
$$) as (v agtype);

AGE确保您的图形在边方面具有双向关系。
尝试以下查询进行检查:

SELECT * FROM cypher('test_graph', $$ MATCH (a)-[r]->(b) RETURN r $$) as (v agtype);

退货:

{"id": 9570149208162308, "label": "REL", "end_id": 9851624184872964, "start_id": 9851624184872963, "pro
perties": {"name": "omar->hossam"}}::edge

相反关系匹配的查询

SELECT * FROM cypher('test_graph', $$ MATCH (b)-[r]->(a) RETURN r $$) as (v agtype);

退货:

{"id": 9570149208162308, "label": "REL", "end_id": 9851624184872964, "start_id": 9851624184872963, "pro
perties": {"name": "omar->hossam"}}::edge

但是,如果你需要的关系是hossam->omar的形式。您需要定义另一个关系,最好是从(a)-[r]->(b)开始。它将显示为另一个边缘。
或,
一个更好的方法是将关系隐含为以下b.name+'<->'+a.name

相关问题