【问题标题】:How can we create undirected edge between two nodes in apache age graph database我们如何在 apache age 图形数据库中的两个节点之间创建无向边
【发布时间】:2023-02-12 15:56:59
【问题描述】:

如何连接这两个节点之间的无向边,如下所示:

SELECT * from cypher(
'munmud_graph', 
$$ 
    CREATE (v:Country {"name" : "Bangladesh"}) 
    RETURN v
$$
) as (v agtype); 
SELECT * from cypher(
'munmud_graph', 
$$ 
    CREATE (v:Country {"name" : "India"}) 
    RETURN v
$$
) as (v agtype); 

我想将这两个节点与标签为 Neighbor 的无向边连接起来

【问题讨论】:

    标签: graph-databases apache-age


    【解决方案1】:

    支持创建和存储无向边,尽管您可以读取/查询边并忽略它们的方向。

    要创建边缘,您可以执行以下操作:

    SELECT * from cypher(
    'munmud_graph', 
    $$ 
        MATCH
          (x:Country),
          (y:Country)
        WHERE x.name = 'Bangladesh' AND y.name = 'India'
        CREATE (x)-[r:Neighbour]->(y)
        RETURN r
    $$
    ) as (r agtype); 
    

    然后查询边缘并忽略它的方向,你会这样做:

    SELECT * from cypher(
    'munmud_graph', 
    $$ 
        MATCH (x:Country)-[r]-(y:Country)
        WHERE x.name = 'Bangladesh' AND y.name = 'India'
        RETURN r
    $$
    ) as (r agtype); 
    

    【讨论】:

      【解决方案2】:

      我相信,到今天为止,使用 Apache AGE 执行此操作的唯一方法是使用类似于此无向的属性设置边缘或将其设置为双向。

      考虑到这一点,以下两个示例均无效:

      -- EXAMPLE 1 : UNDIRECTED EDGE (DOES NOT WORK)
      
      SELECT * FROM cypher ('demo', $$
      MATCH (a:Country), (b:Country)
      WHERE a.name = "India" AND b.name = "Bangladesh"
      CREATE (a)-[e:BORDERS_WITH]-(b)
      RETURN e
      $$) as (e agtype);
      
      ERROR:  only directed relationships are allowed in CREATE
      LINE 4: CREATE (a)-[e:BORDERS_WITH]-(b)
      
      
      -- EXAMPLE 2 : BIDIRECTIONAL EDGE (DOES NOT WORK)
      
      SELECT * FROM cypher ('demo', $$
      MATCH (a:Country), (b:Country)
      WHERE a.name = "India" AND b.name = "Bangladesh"
      CREATE (a)<-[e:BORDERS_WITH]->(b)
      RETURN e
      $$) as (e agtype);
      
      ERROR:  syntax error at or near ">"
      LINE 4: CREATE (a)<-[e:BORDERS_WITH]->(b)
      

      但这有效:

      -- EXAMPLE 3 : SET BIDIRECTIONAL EDGE AS PROPERTY (WORKS)
      
      SELECT * FROM cypher ('demo', $$
      MATCH (a:Country), (b:Country)
      WHERE a.name = "India" AND b.name = "Bangladesh"
      CREATE (a)-[e:BORDERS_WITH{ type:"<->" }]->(b)
      RETURN e
      $$) as (e agtype);
      
                                                                              e
      --------------------------------------------------------------------------------------------------------------------------------------------------
       {"id": 2533274790395905, "label": "BORDERS_WITH", "end_id": 2251799813685249, "start_id": 2251799813685250, "properties": {"type": "<->"}}::edge
      (1 row)
      
      demo=#
      

      然后,如果您想查找哪些边是“<->”类型,您只需键入以下查询:

      SELECT * FROM cypher ('demo', $$
      MATCH (a)-[e:BORDERS_WITH]->(b)
      WHERE e.type = "<->"
      RETURN e
      $$) as (e agtype);
                                                                              e
      --------------------------------------------------------------------------------------------------------------------------------------------------
       {"id": 2533274790395905, "label": "BORDERS_WITH", "end_id": 2251799813685249, "start_id": 2251799813685250, "properties": {"type": "<->"}}::edge
      (1 row)
      

      【讨论】:

      • 如果你在方向上不匹配,最后一个实际上会更好。你可以在 (a)-[e]-(b) 上匹配,你只是不能创建那样的边缘。
      • 但是对于这个例子,它不会重复同一条边两次吗?
      • 如果仅创建一条边,则 (a)-[e]-(b) 上的匹配仅返回一条边。您必须在两个方向上创建边缘才能在 (a)-[e]-(b) 上进行匹配以返回两个方向的边缘。
      • 只是为了进一步澄清这一点,如果 MATCH 模式未绑定(如 ()-[e]-() 中)并且如果您正在查询该边的某些方面,则该边将返回两次。但是因为我们只存储了从 a 到 b 的一条边,所以我们应该只看到一个结果。
      【解决方案3】:

      您可以做的是在节点之间创建定向关系,并且您将在两个方面都有优势,例如:

      我运行命令:

      现在,当您显示边缘时,它会向您显示两个国家:

      【讨论】:

        【解决方案4】:
        SELECT * from cypher(
        'munmud_graph', 
        $$ 
            MATCH (a:Country {name: "Bangladesh"}), (b:Country {name: "India"})
            CREATE (a)-[:Neighbour]->(b)
            RETURN a, b
        $$
        ) as (a, b);                                                                         
        

        希望这对你有用

        【讨论】:

          猜你喜欢
          • 2020-08-30
          • 1970-01-01
          • 2017-04-03
          • 1970-01-01
          • 1970-01-01
          • 2017-12-07
          • 2023-04-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多