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)
我们插入了两个设置为Alice
和Bob
的属性的顶点。
让我们使用查询检索这些顶点:
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插入和检索数据查询也是如此。
我希望您发现这篇博客文章提供了丰富的信息和乐于助人。快乐的图形!