关于这篇文章
当前的,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。
运行教程
:播放开始
输入部分显示一个区域。每个都像是用于不同目的的教程。
- 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我得到了这个结果:
查询执行// 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我得到了这个结果:
查询执行// 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我得到了这个结果:
清理和确认MATCH (n) DETACH DELETE n MATCH (n) RETURN n对教程的思考
我试过一次教程。我发现 RDB 可以使用单个查询语句执行,而无需编写复杂的 SQL 或创建大型程序就无法完成。
教程中使用的示例是一个示例,如果您查看操作语言密码的手册,您会发现有多种功能可供使用。正如我一开始提到的,我认为对于关系为网络类型的数据,在特定条件下获取数据时是有效的。
以编程方式尝试
我认为您将以编程方式使用它,而不是在真实系统的命令行上使用它。找到驱动程序并尝试以编程方式使用它。
Java、Javascript、Python、.NET、Go驱动都是官方准备的,貌似各个语言社区都提供了驱动。
我使用 Python 是因为我可以在我的环境中轻松运行 Python。
pip install neo4jgithub示例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服务器并输入数据并调查它。在 Neo4j 的 UI 上的图形显示中,可以自由移动节点的位置等,操作本身很有趣。
原创声明:本文系作者授权爱码网发表,未经许可,不得转载;
原文地址:https://www.likecs.com/show-308629174.html