关于这篇文章

当前的,AWS 认证的数据库专家我在学习。其中,亚马逊海王星的故事就出现了。据说是Graph Database。它看起来像一个既不是RDB也不是Key-Value的数据库,我想知道它有什么样的特点。这将是验证记录。

环境

本文内容在以下环境中执行。

WSL2
Ubuntu 22.04.1 LTS
Neo4j 社区版 4.4.11

从文章中学习

首先,让我们看一下开始它的 AWS 文章。

为存储和导航关系而构建的数据库。

我正是这个意思。欺诈检测和推荐引擎作为用例引入,在用例中提取数据之间的关系似乎很有效。仅凭这一点,我觉得用RDB就可以了(顾名思义,它是一个关系型数据库)。

这篇文章有答案。在检查与朋友的关系的情况下,检查“朋友的朋友”(深度 2)的情况与 RDB 没有太大区别,而检查“朋友的朋友的朋友”的情况(深度 2)在深度 3) ,差异变得明显,除此之外,RDB 变得不可用。
这样看来,对于具有网络类型关系的数据,它似乎适合在检查深度为 3 或以上的关系时使用。

另外,在上一篇之后的文章中,我们介绍了用例。根据这里

更灵活地添加/修改新数据

这一点也是一种力量。使用RDB,确定表结构是绝对必要的。即使数据的关系不统一,RDB似乎也很难处理。

试试看

正如标题所示,我们将实际使用它来理解它。

思考数据

为了使用它,需要将数据输入到数据库中。由于自己很难做到,我想使用现有的开放数据。

本文将在很多方面为您提供帮助。作为样本数据,似乎准备了电影和演员之间的关系数据。

准备 Neo4j 服务器

使用 Amazon Neptune 很昂贵,所以我将尝试在本地安装 Neo4j。我会在参考基础文章的同时跟踪官方页面。

如果你在页面中间选择Start Free For Developers,好像你会使用云服务Neo4j AuraDB。如果你想在本地启动它并在页面中徘徊,似乎有一个官方的docker镜像。

在 WSL2 上,启动 Ubuntu 22.04.1 LTS 映像并运行以下命令。

# データ保持ディレクトリ作成
mkdir -p $HOME/neo4j/data
# 起動
docker run 
    --publish=7474:7474 --publish=7687:7687 
    --volume=$HOME/neo4j/data:/data 
    neo4j

在 Windows 端,当我访问http://localhost:7474 时,会显示登录屏幕。服务器现已准备就绪。码头工人是最好的使用初始 ID/密码“neo4j/neo4j”登录后,系统会要求您输入新密码。之后,显示初始屏幕。

这是执行稍后将执行的教程后的屏幕。像这样以 Graph 格式(根据内容为 Table 格式)显示执行结果的 UI。
Graph Databaseって何? Neo4jを実際に使って理解する事にしました。

运行教程

:播放开始

输入部分显示一个区域。每个都像是用于不同目的的教程。

  • Neo4j 浏览器入门
    介绍如何使用当前显示的屏幕控制台
  • 使用实时数据试用 Neo4j
    它似乎使用演员、导演和电影之间关系的数据来执行一系列操作。
  • 密码基础知识
    这是对 Neo4j 的称为 Cypher 的操作语言的描述。

Neo4j 浏览器入门

我正在就如何使用屏幕进行讲座。最后有一个链接可以转到Concepts Guide

概念指南

描述图数据库的基本概念。我将描述我所理解的。

节点 - 每个分类实体的数据
标签 - 表示节点的分类(例如人、汽车)
关系 - 节点之间关系的定义(例如出现、认识、朋友)
属性 - 可以为节点和关系提供名称-值信息(例如人名、电影名称)

密码指南

我会按照Cypher basics的教程输入命令。

节点创建
CREATE (ee:Person {name: 'Emil', from: 'Sweden', kloutScore: 99})
节点搜索
MATCH (ee:Person) WHERE ee.name = 'Emil' RETURN ee;
多条命令执行
MATCH (ee:Person) WHERE ee.name = 'Emil'
CREATE (js:Person { name: 'Johan', from: 'Sweden', learn: 'surfing' }),
(ir:Person { name: 'Ian', from: 'England', title: 'author' }),
(rvb:Person { name: 'Rik', from: 'Belgium', pet: 'Orval' }),
(ally:Person { name: 'Allison', from: 'California', hobby: 'surfing' }),
(ee)-[:KNOWS {since: 2001}]->(js),(ee)-[:KNOWS {rating: 5}]->(ir),
(js)-[:KNOWS]->(ir),(js)-[:KNOWS]->(rvb),
(ir)-[:KNOWS]->(js),(ir)-[:KNOWS]->(ally),
(rvb)-[:KNOWS]->(ally)
精细化收购
MATCH (ee:Person)-[:KNOWS]-(friends)
WHERE ee.name = 'Emil' RETURN ee, friends

电影图表

感觉对基本操作有了一定的了解。接下来我按照Try Neo4j with live data的教程输入命令。这是对电影-演员关系数据的操作。

先清理
MATCH (n) DETACH DELETE n
输入数据(*当您按下播放按钮时,命令似乎已被转录。)
CREATE (TheMatrix:Movie {title:'The Matrix', released:1999, tagline:'Welcome to the Real World'})
// 以後省略
约束创建
CREATE CONSTRAINT ON (n:Movie) ASSERT (n.title) IS UNIQUE
CREATE CONSTRAINT ON (n:Person) ASSERT (n.name) IS UNIQUE
索引
CREATE INDEX FOR (m:Movie) ON (m.released)
查询执行
// nameが"Tom Hanks"のPersonノードを取得:
MATCH (tom:Person {name: "Tom Hanks"}) RETURN tom
// titleが"Cloud Atlas"のMovieノードを取得
MATCH (cloudAtlas:Movie {title: "Cloud Atlas"}) RETURN cloudAtlas
// Personノードを10件取得
MATCH (people:Person) RETURN people.name LIMIT 10
// 1990年から2000年より前にリリースされた映画を取得
MATCH (nineties:Movie) WHERE nineties.released >= 1990 AND nineties.released < 2000 RETURN nineties.title
查询执行
// Kevin Baconから4ステップ以内にいるノードを取得
MATCH (bacon:Person {name:"Kevin Bacon"})-[*1..4]-(hollywood)
RETURN DISTINCT hollywood
查询执行
// 組み込み関数shortestPathを使用して、Kevin BaconとMeg Ryanの最短ルートを取得
MATCH p=shortestPath(
(bacon:Person {name:"Kevin Bacon"})-[*]-(meg:Person {name:"Meg Ryan"})
) RETURN p

我得到了这个结果:
Graph Databaseって何? Neo4jを実際に使って理解する事にしました。

查询执行
// Tom Hanksの共演者の共演者でTom Hanksと共演した事の無いPersonを取得してルートの件数で逆ソート
MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(m)<-[:ACTED_IN]-(coActors),
    (coActors)-[:ACTED_IN]->(m2)<-[:ACTED_IN]-(cocoActors)
  WHERE NOT (tom)-[:ACTED_IN]->()<-[:ACTED_IN]-(cocoActors) AND tom <> cocoActors
  RETURN cocoActors.name AS Recommended, count(*) AS Strength ORDER BY Strength DESC

我得到了这个结果:
Graph Databaseって何? Neo4jを実際に使って理解する事にしました。

查询执行
// Tom HanksにTom Cruiseを紹介できる(共演者の共演者)Personを取得
MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(m)<-[:ACTED_IN]-(coActors),
  (coActors)-[:ACTED_IN]->(m2)<-[:ACTED_IN]-(cruise:Person {name:"Tom Cruise"})
RETURN tom, m, coActors, m2, cruise

我得到了这个结果:
Graph Databaseって何? Neo4jを実際に使って理解する事にしました。

清理和确认
MATCH (n) DETACH DELETE n
MATCH (n) RETURN n

对教程的思考

我试过一次教程。我发现 RDB 可以使用单个查询语句执行,而无需编写复杂的 SQL 或创建大型程序就无法完成。

教程中使用的示例是一个示例,如果您查看操作语言密码的手册,您会发现有多种功能可供使用。正如我一开始提到的,我认为对于关系为网络类型的数据,在特定条件下获取数据时是有效的。

以编程方式尝试

我认为您将以编程方式使用它,而不是在真实系统的命令行上使用它。找到驱动程序并尝试以编程方式使用它。

Java、Javascript、Python、.NET、Go驱动都是官方准备的,貌似各个语言社区都提供了驱动。

我使用 Python 是因为我可以在我的环境中轻松运行 Python。

pip install neo4j
github示例
from neo4j import GraphDatabase

driver = GraphDatabase.driver("neo4j://localhost:7687",
                              auth=("neo4j", "password"))

def add_friend(tx, name, friend_name):
    tx.run("MERGE (a:Person {name: $name}) "
           "MERGE (a)-[:KNOWS]->(friend:Person {name: $friend_name})",
           name=name, friend_name=friend_name)

def print_friends(tx, name):
    query = ("MATCH (a:Person)-[:KNOWS]->(friend) WHERE a.name = $name "
             "RETURN friend.name ORDER BY friend.name")
    for record in tx.run(query, name=name):
        print(record["friend.name"])

with driver.session() as session:
    session.execute_write(add_friend, "Arthur", "Guinevere")
    session.execute_write(add_friend, "Arthur", "Lancelot")
    session.execute_write(add_friend, "Arthur", "Merlin")
    session.execute_read(print_friends, "Arthur")

driver.close()

好像是先获取了Neo4j session,从那里准备了各种写和读的方法。
似乎回调函数(?)和用于它的参数传递给上述两个方法。此外,cypher 命令似乎是可以按原样执行命令语句的形式。它类似于可以按原样执行 SQL 语句的 RDB 驱动程序。

结果
$ python neo4j_test.py
Guinevere
Lancelot
Merlin

当我在 Neo4j 控制台上检查时,正确注册了 4 个节点。
Graph Databaseって何? Neo4jを実際に使って理解する事にしました。

概括

我希望您已经了解了 Graph Database 是什么,这也是本文的目的。当然,如果实际用在某种应用中,我认为会处理得更深一些,但至少我认为我能够掌握基本特征。这是一个很好的教程。

以后如果有想深入调查某种关系的案例,我想我会想启动Neo4j服务器并输入数据并调查它。在 Neo4j 的 UI 上的图形显示中,可以自由移动节点的位置等,操作本身很有趣。


原创声明:本文系作者授权爱码网发表,未经许可,不得转载;

原文地址:https://www.likecs.com/show-308629174.html

相关文章:

  • 2021-09-08
  • 2021-11-18
  • 2021-12-12
  • 2021-09-17
  • 2019-09-13
  • 2021-09-07
  • 2021-12-10
猜你喜欢
  • 2021-05-27
  • 2021-12-05
  • 2021-12-12
  • 2019-08-05
  • 2021-12-05
  • 2021-08-03
  • 2021-11-17
  • 2021-12-06
相关资源
相似解决方案