在本系列的第一篇文章中,我们探讨了图数据库的一些核心概念。这次,我们将安装 Neo4j 应用程序,并开始使用 Web 客户端在图中插入和查询数据。
要下载 Neo4J 的社区版,请访问他们的网站!您可以下载适用于 Windows 或 OSX 的软件包,它们可以很好地用于测试,并且还有适用于大多数 Linux 发行版以及通过 Docker 安装的链接。
我将在 Debian 9 (stretch) 上安装该软件。您可以在此处获取完整说明。如果您运行的是 Debian 8 (jessie) 或更旧版本,则可以安装当前的 Neo4j 软件包,但这会比较困难,因为 Neo4j 需要 Java 8 运行时,而 jessie 没有打包该运行时。
wget -O - https://debian.neo4j.org/neotechnology.gpg.key | sudo apt-key add -
echo 'deb https://debian.neo4j.org/repo stable/' | sudo tee /etc/apt/sources.list.d/neo4j.list
sudo apt-get update
sudo apt-get install neo4j
在我的系统上,我必须创建 /var/run/neo4j,原因不明,然后它就轻松启动了。我收到了关于最大打开文件数的警告,但这最终不是问题,因为这只是一个测试。默认情况下,Neo4j 将仅在 localhost 上侦听连接。如果您的 Debian 机器是台式机,这很好,但我的不是。我编辑了 /etc/neo4j/neo4j.conf 并取消注释了这一行
dbms.connectors.default_listen_address=0.0.0.0
停止并重新启动 Neo4j 后,我能够通过在端口 7474 上浏览服务器来连接。Neo4j 用户的默认密码是 neo4j;您必须设置新密码,然后启动屏幕将显示

opensource.com
让我们使用上一篇文章中的图,并在 Neo4j 中创建它。再次查看

opensource.com
像 MySQL 和其他数据库系统一样,Neo4j 对所有操作都使用查询系统。Cypher,Neo4j 的查询语言,有一些语法怪癖,需要一段时间才能适应。节点始终用括号括起来,关系用方括号括起来。由于这是唯一的数据类型,因此这就是您所需要的全部。
首先,让我们创建所有节点。您可以将这些复制并粘贴到浏览器窗口顶部的框中,这是运行查询的位置。
CREATE (a:Person { name: 'Jane Doe', favorite_color: 'purple' })
CREATE (b:Person { name: 'John Doe' })
CREATE (c:Person { name: 'Mary Smith', favorite_color: 'red', dob: '1992-11-09' })
CREATE (d:Person { name: 'Robert Roe' })
CREATE (e:Person { name: 'Rhonda Roe' })
CREATE (f:Person { name: 'Ryan Roe' })
CREATE (t:City { name: 'Petaluma, CA' })
CREATE (u:City { name: 'Cypress, TX' })
CREATE (v:City { name: 'Grand Prairie, TX' })
CREATE (w:City { name: 'Houston, TX' })
请注意,标签之前的字母是变量。这些将在其他地方显示;它们在这里没有用,但是您不能在没有分配的情况下盲目创建,因此我们将使用它们,然后丢弃它们。
您应该被告知已创建 10 个节点并设置了 13 个属性。想看看它们吗?这是一个匹配并返回所有节点的查询
MATCH (n)
RETURN n
这将返回一个可视化图。(在应用程序中,您可以使用返回图上的“全屏”图标来查看整个图。)您将看到类似这样的内容

opensource.com
添加关系有点棘手;您必须使要连接的节点“在作用域内”,即在当前查询的作用域内。我们之前使用的变量已超出作用域,因此让我们找到 John 和 Jane 并让他们结婚
MATCH (a:Person),(b:Person)
WHERE a.name='Jane Doe' AND b.name='John Doe'
CREATE (a)-[r:MARRIAGE {date: '2017-03-04', place: 'Houston, TX'}]->(b)
此查询将设置两个属性并创建一个关系。重新运行 MATCH 查询会显示该关系。您可以将鼠标箭头指向任何节点或关系以查看该项目的属性。
让我们添加其余的关系。我将执行一次 MATCH 语句,而不是执行一堆 MATCH 语句,并从中创建多个关系。
MATCH (a:Person),(b:Person),(c:Person),(d:Person),(e:Person),(f:Person),(t:City),(u:City),(v:City),(w:City)
WHERE a.name='Jane Doe' AND b.name='John Doe' AND c.name='Mary Smith' AND d.name='Robert Roe'
AND e.name='Rhonda Roe' AND f.name='Ryan Roe' AND t.name='Petaluma, CA' AND u.name='Cypress, TX'
AND v.name='Grand Prairie, TX' AND w.name='Houston, TX'
CREATE (d)-[m2:MARRIAGE {date: '1990-12-01', place: 'Chicago, IL'}]->(e)
CREATE (a)-[n:CHILD]->(c)
CREATE (d)-[n2:CHILD]->(f)
CREATE (e)-[n3:CHILD]->(f)
CREATE (b)-[n4:STEPCHILD]->(c)
CREATE (a)-[o:BORN_IN]->(v)
CREATE (b)-[o2:BORN_IN]->(t)
CREATE (c)-[p:DATING]->(f)
CREATE (a)-[q:LIVES_IN]->(u)
CREATE (b)-[q1:LIVES_IN]->(u)
CREATE (a)-[r:WORKS_IN]->(w)
CREATE (a)-[s:FRIEND]->(d)
CREATE (a)-[s2:FRIEND]->(e)
使用 MATCH 语句重新查询,您应该得到如下所示的图

opensource.com
如果愿意,您可以拖动节点,最终得到与我之前的绘图相同的图。
在此示例中,我们唯一执行的 MATCH 是匹配所有内容。这是一个将返回已婚夫妇并显示他们之间关系的查询
MATCH (a)-[b:MARRIAGE]->(c)
RETURN a,b,c
使用更精细的图,您可以进行更详细的搜索。例如,如果您有一个电影和人物节点的图,并且关系是诸如 ACTED IN、DIRECTED、WROTE SCREENPLAY 等角色,则可以执行如下查询
MATCH (p:Person { name: 'Mel Gibson' })--(m:Movie)
RETURN m.title
...并返回与 Mel Gibson 以任何方式相关的电影列表。但是,如果您只想要他担任演员的电影,则此查询会更有用
MATCH (p:Person { name: 'Mel Gibson' })-[r:ACTED_IN]->(m:movie)
RETURN m.title,r.role
当然,可以使用更复杂的 Cypher 查询,而我们在这里只是触及皮毛。Cypher 语言的完整文档可在 Neo4j 网站上找到,其中包含大量示例可供使用。
在本系列的下一篇文章中,我们将编写一个小型的 Perl 脚本来创建相同的图,以展示如何在应用程序中使用图数据库。
评论已关闭。