Apache Age的PostgreSQL场景背后是什么?
#postgres #database #db #apacheage

PostgreSQL后端与Apache Age

在这篇博客文章中,我们将深入了解PostgreSQL与Apache Age一起工作时的后端中发生的事情,从创建新的图表到该图内查询数据。

我很高兴能开始学习它!

创建新图

首先,让我们创建一个带有名称test的新图:

SELECT * FROM create_graph('test');

您能猜出后台会发生什么吗?

让我告诉你:为该图创建了很多表。不仅表,而且我们还为该图创建了一个名为图名称的图形的全命名空间。

之后,图的内容是什么?

  • 节点
  • 边缘

那么,我们需要这些表吗?

SELECT * FROM test._;

单击选项卡以查看建议。您会看到以下表:

  • _ag_label_edge
  • _ag_label_edge_id_seq
  • _ag_label_vertex
  • _ag_label_vertex_id_seq

明白了!这些表是为将节点和边缘存储在图表中的创建的。

从图形查询数据

现在我们创建了一个新图,让我们将一些数据插入其中并使用查询来检索。

SELECT * from cypher('test', $$ CREATE (n:Person{name: "Bob"}) RETURN n $$) as (res agtype);
SELECT * from cypher('test', $$ CREATE (n:Person{name: "Alice"}) RETURN n $$) as (res agtype)

我们插入了两个设置为AliceBob的属性的顶点。

让我们使用查询检索这些顶点:

SELECT * from cypher('test', $$ MATCH (n:Person) RETURN n $$) as (res agtype);
                                          res                                          
---------------------------------------------------------------------------------------
 {"id": 844424930131971, "label": "Person", "properties": {"name": "Bob"}}::vertex
 {"id": 844424930131972, "label": "Person", "properties": {"name": "Alice"}}::vertex

如果我们想使用SQL做到这一点?

test=# select * from test._ag_label_vertex;
       id        |     properties      
-----------------+---------------------
 844424930131971 | {"name": "Bob"}
 844424930131972 | {"name": "Alice"}

那里有什么问题?我们无法直接指定查询的标签,就像我们要求使用标签 Person
的节点时 如果我们使用另一个标签插入了一些节点?
让我们看看

SELECT * from cypher('test', $$ MATCH (n:NotPerson{name: "NotAlice"}) RETURN n $$) as (res agtype);
                                            res                                             
--------------------------------------------------------------------------------------------
 {"id": 1125899906842625, "label": "NotPerson", "properties": {"name": "NotAlice"}}::vertex

让我们再次进行相同的查询

test=# SELECT * from cypher('test', $$ MATCH (n:Person) RETURN n $$) as (res agtype);
                                          res                                          
---------------------------------------------------------------------------------------
 {"id": 844424930131971, "label": "Person", "properties": {"name": "Bob"}}::vertex
 {"id": 844424930131972, "label": "Person", "properties": {"name": "Alice"}}::vertex

,如果我们要过滤另一个标签,我们可以肯定地做到这一点

test=# SELECT * from cypher('test', $$ MATCH (n:NotPerson{name: "NotAlice"}) RETURN n $$) as (res agtype);
                                            res                                             
--------------------------------------------------------------------------------------------
 {"id": 1125899906842625, "label": "NotPerson", "properties": {"name": "NotAlice"}}::vertex
(1 row)

我们可以在SQL中做到吗?

select * from  test._ag_label_vertex;
        id        |      properties      
------------------+----------------------
 844424930131971  | {"name": "Bob"}
 844424930131972  | {"name": "Alice"}
 1125899906842625 | {"name": "NotAlice"}

我们需要加入吗?

tbh 当我向您展示了为图表创建的表时,我一直是诚实的,但不是 100%,因为我们正在进行中创建的表< /strong>当我们创建新的标签或使用不存在的标签创建新节点时,它会导致新的 table < /p>

这样,如果我们将使用名称空间测试列出表,我们将看到新的表在那里

select * from  test.
test._ag_label_edge           test._ag_label_vertex_id_seq  test."NotPerson_id_seq"       
test._ag_label_edge_id_seq    test._label_id_seq            test."Person"                 
test._ag_label_vertex         test."NotPerson"              test."Person_id_seq"          

我们已经注意到我们得到了标签创建的,并且可以肯定的是,它们将包括与该节点有关的节点,这些节点 label < br> 对于示例让我们查看 notperson 表的内容

select * from  test."NotPerson";
        id        |      properties      
------------------+----------------------
 1125899906842625 | {"name": "NotAlice"}

记忆明智它不是完美的,但是 和时间上,它是 perfect

同样,我们可以在这些顶点之间插入边缘:

INSERT INTO test."NotPerson" (properties) VALUES (agtype('{"name":"Mohamed"}'));

确保它吗?在SQL!
上工作

select * from test."NotPerson"
test-# ;
 1125899906842625 | {"name": "NotAlice"}
 1125899906842626 | {"name": "NotAlice2"}
 1125899906842627 | {"name": "Mohamed"}

它在匹配的电视机上有效吗?
让我们看看

SELECT * from cypher('test', $$ MATCH (n:NotPerson{}) RETURN n $$) as (res agtype);
 {"id": 1125899906842625, "label": "NotPerson", "properties": {"name": "NotAlice"}}::vertex
 {"id": 1125899906842626, "label": "NotPerson", "properties": {"name": "NotAlice2"}}::vertex
 {"id": 1125899906842627, "label": "NotPerson", "properties": {"name": "Mohamed"}}::vertex

工作完美
以及与所有节点匹配的都将包括:

SELECT * from cypher('test', $$ MATCH (n) RETURN n $$) as (res agtype);
 {"id": 844424930131971, "label": "Person", "properties": {"name": "Bob"}}::vertex
 {"id": 844424930131972, "label": "Person", "properties": {"name": "Alice"}}::vertex
 {"id": 1125899906842625, "label": "NotPerson", "properties": {"name": "NotAlice"}}::vertex
 {"id": 1125899906842626, "label": "NotPerson", "properties": {"name": "NotAlice2"}}::vertex
 {"id": 1125899906842627, "label": "NotPerson", "properties": {"name": "Mohamed"}}::vertex

这意味着插入标签的表格也使插入顶点表:这意味着我们到目前为止很安全

结论

在这篇博客文章中,我们看到了如何使用Apache Age在 Postgresql 中创建新图,以及如何使用查询和SQL插入和检索数据查询也是如此。

我希望您发现这篇博客文章提供了丰富的信息和乐于助人。快乐的图形!