neo4j数据库与java
如果您没有注意到,图形数据库在软件行业中的流行度正在Swift上升,这在一定程度上要归功于Google,Facebook和Twitter等公司将它们放在地图上。 在六月《 JAX杂志》上的这篇文章中,迈克尔·汉格( Michael Hunger)解释了如何充分利用不断增长的趋势,着眼于Neo4j的领先技术之一。
那里有一个信息世界,大小不是国王,而连通性就是王位。 现实世界和数字世界中的所有事物都是相互联系的,这些关系中的价值巨大。 历史事件与政治领域和个人参与者息息相关。 基因表达来源于DNA和环境因素。 网络,计算机,应用程序和用户形成了复杂的交互网络。 我们生活的方方面面都由相互联系的信息和事物所主导。 大型互联网公司正在尝试通过Google知识图或Facebook图搜索等方法来利用这种力量。
图1:利用图数据的力量
而且,每当我们要将这些现实世界的数据存储在数据库中时,我们都必须以某种方式处理这一事实。 通常,连接会被忽略,反规范化或聚合以适合数据模型并使操作足够快。 这样做会使您失去的是,使用其他数据模型和数据库可以保留的丰富信息。 这就是显示属性图模型和图数据库的地方。 另一方面,如果图形形状的数据显示在关系数据库中,则可以通过查询中大量的中间联接表和联接语句轻松地识别出它(并降低性能水平)。
图2:图论
图论比任何人想象的都要古老 。 但是,使用数据库语义(例如ACID Transactions)显式处理图形是新的。 图形数据库是最近NoSQL运动的一部分,它主要意味着非关系数据库。 它们大多数是开源的,对开发人员友好的,并带有适合特定用例的专用数据模型。
图形数据库非常适合于存储,检索和快速查询有趣的信息网络。 这种连接的数据也称为图形–请勿与图稿,图表或图表混合。 图由节点和有向的,有类型的关系组成,两者都可以容纳任意数量和类型的属性(键值属性)。 这就是图模型的全部内容。
图3:属性图
过去,在为关系数据库建模(ER-图),在与某些同事的白板上绘制域(圆和线)或创造性地收集信息(思维导图)时,您肯定使用过图形。 图形模型的简单性使其易于理解,而直接的可视化使其变得更加容易!
输入Neo4j
这些图数据库有何好处 ,让我们以Neo4j (我正在研究的开源数据库)为例。 它是用Java实现的本机图形数据库。 这意味着其内部数据库结构直接将节点和关系(和属性)表示为数据库文件中的记录。 它不位于另一个数据库之上,而是使用自己的基础结构,该基础结构是专门为处理图形形状的数据而开发的。
图形数据库如何实现高速导航? 它使用便宜的把戏。 图数据库不会在每次发出查询时都会重新创建连接(这对内存和CPU产生巨大影响),就像大多数其他数据库一样,图形数据库会在插入时实现一次连接。 然后需要花费一次时间,但是对于每个查询或遍历而言,从一个节点导航到另一个节点都是恒定时间操作。 它仅需遵循指向另一端的现有持久关系。 而且这种跳跃是超快的。
Neo4j将节点和关系表示为嵌入式Java-API中的Java对象,服务器的REST-API中的JSON对象以及查询语言Cypher中的ASCII艺术。
等等,ASCII艺术? 这是如何运作的? 还记得白板上的线条和圆圈吗? 好吧,如果我们以这种方式可视化一个真实的域,它很快就会变得非常复杂,尤其是如果我们没有看到树木茂密的森林。 但是我们在找什么呢? 我们想在该图中找到模式,并希望在这些模式内汇总和投影数据,以便回答问题并处理用例。 因此,通过图形可视化,我们可以通过以其他颜色重新绘制图案来轻松突出显示图案。
图4:关系
但是,我们将如何使用文本声明性查询语言来做到这一点呢? 这就是ASCII艺术的来历。我们为节点使用带括号的名称,为关系使用虚线箭头。 关系类型显示在方括号中,属性显示为类似JSON的符号。
密码快速入门
Cypher入门很容易。 Neo4j手册中有Cypher的学习曲目,漂亮的备忘单和完整的部分 。 几分钟后,您就可以在计算机上启动并运行Neo4j Server并开始使用它。 或者,您可以在<a href=”http://neo4j.org/learn/try”> Neo4j在线控制台</a>的沙箱中播放。
在电影领域的此示例中,您可以看到它的外观。
- (m:Movie {title: "The Matrix"})
- <-[:ACTS_IN {role:"Neo"}]-
- (a:Actor {name:"Keanu Reeves"})
我们将Cypher视为一种针对可读性和陈述意图进行了优化的人道语言。 您可以声明要在图中匹配的模式,以及要应用于匹配结果的哪些操作,过滤,聚合,排序和分页。 在Cypher中,您没有陈述要完成某事的方式,而是要寻找的东西。 在这方面,它类似于SQL。 另一方面,它在声明节点之间的复杂关系,指定可变长度的路径,应用图算法,处理集合,链接子查询以及传递中间结果方面要强大得多。 Cypher不仅允许快速而强大的查询,还允许在图中创建和更新信息。
// creates a movie with all its actors in one go
CREATE (m:Movie {title:{movie_title}})
FOREACH (a in {actors} : CREATE (a:Actor {name:a[0]})-[:ACTS_IN {role:a[1]}]->m)
// find the 10 most frequent co-actors of Keanu Reeves
MATCH (keanu:Actor)-[:ACTS_IN]->()<-[:ACTS_IN]-(co:Actor)
WHERE keanu.name="Keanu Reeves"
RETURN co.name, count(*) as times
ORDER BY times DESC
LIMIT 10
在嵌入式和服务器部署模式下,Cypher是使用Neo4j进行安装和运行的最简单方法,它在编写应用程序方面提供了极大的帮助。 要以您喜欢的编程语言或风格与Neo4j进行交互,可以从多种驱动程序中进行选择。
Neo4j 2.0的新功能是什么?
首先,我们十年来首次更改了数据模型。 现在,不仅可以标记关系,还可以标记节点。 这使得在图中表示事物的类型(每个节点多个)变得更加容易,并且允许进行多种优化以获取该信息。 在这些节点标签之上,我们可以开始声明按标签和属性定义的自动索引,并且可以引入属性约束(考虑唯一性,值范围,属性类型)。
CREATE INDEX ON :Movie(title);
// uses the index
MATCH (m:Movie) WHERE m.title = "The Matrix";
// examples for a unique constraint
CREATE CONSTRAINT ON (actor:Actor) ASSERT actor.name IS UNIQUE
Neo4j 2.0还带来了新的MERGE功能,该功能使您可以匹配和查找指定的模式,如果不存在则创建部分或整个模式,或者在插入或匹配时更新单独的操作。
MERGE (keanu:Person {name:'Keanu Reeves'})
ON CREATE keanu SET keanu.created = timestamp()
ON MATCH keanu SET keanu.lastSeen = timestamp()
RETURN keanu;
我们真的很兴奋的另一件事是新的事务处理Cypher http端点。 到目前为止,我们对Neo4j服务器的每个请求仅支持一个事务。 现在,将创建一个事务并将其保持活动状态,直到显式提交(POST到/ transaction / id / commit URL)或回滚(DELETE / transaction / id)被发布到端点或发生事务超时为止。 一个人可以按照流式方式向端点发送任意多的Cypher语句,并同时接收流回的结果。 此端点的详细程度也比以前的版本少得多。
这允许出现一套全新的驱动程序,这些驱动程序专注于Cypher作为与Neo4j交互的唯一方式,并且与当前SQL工具非常相似,并且可以更好地与其他软件集成。
那么如何开始使用图形数据库呢? 首先,要退后一步。 要创建您的域的良好图形模型,需要花费一些时间来学习关系模型。 但实际上一点都不难。 只需抓住一两个同事和一个白板,然后开始绘制您的域示例,其中包含查找即将出现的问题和用例的答案所需的所有信息和关系。 这是您要使用的模型,而不是现有的技术驱动的数据库模型。
牢记这一模型,下一步是将数据导入图形数据库 。 因此,首先下载Neo4j Server 2.0并启动它。 在本地Web UI上,您可以可视化数据,但是我们首先对交互式控制台外壳感兴趣。 该Shell允许您针对正在运行的服务器运行Cypher命令,就像使用任何SQL工具一样。 这些命令可以查询和更新数据库,如您之前所见。 确保手头有Cypher备忘单以检查语法。
现在,您可以以可行的格式从现有数据库(或数据生成器)中获取一些数据。 一种方法是为将来的节点和关系创建单独的CSV文件。 要将这些表格数据转换为图形,您只需生成一些密码语句即可。 因此,要么编写一个小的脚本以输出适当的create语句,要么使用电子表格的字符串连接功能。 如果您有可用的语句,则可能需要将它们包装到一个开始的CREATE中; 创造 …; commit块可确保原子创建数据(全部或全部)。 然后,您可以将此脚本粘贴到Web-UI的控制台中,或将neo4j-shell连接到服务器并执行它们bin / neo4j-shell -f import.cql。
接下来呢?
就是这个。 现在,您可以查询或可视化自己喜欢的图形。 通过为几乎所有编程语言选择完整的驱动程序,可以对数据库进行编程访问。 这些是Neo4j大型开发人员社区的慷慨贡献。 当然,您也可以使用驱动程序之一来获取或生成要插入的数据,然后直接使用Cypher或等效的基于Node&Relationship的API来填充图形。
最后,我想指出图数据模型的广泛适用性。 每个合理高级的数据模型都包含许多重要的连接,并且可以轻松地表示为图形。 当您查看域对象模型并想象指针引用是关系和对象节点时,这一点变得很明显
为了说明这一点,我想指出一些有趣的应用程序:
- Max De Marzi的Facebook Graph Search从Facebook导入数据并将自然语言查询转换为Cypher语句
- Rik Van Bruggen的啤酒图显示即使是非技术人员也可以创建图模型和数据,然后对其进行有趣的查询
- 开放生命之树正在努力创建世界上所有生物的图表
- Shutl为通过电子商务渠道购买的商品的即时(分钟)交付找到最佳的快递和路线
- Telenor在图形模型之上处理复杂的ACL解析算法
如果本文激发您对图形和图形数据库的兴趣,以及它们如何使您的生活和开发变得更轻松,我建议您阅读更全面的图形数据库 ,参加一个本地GraphConnect会议或与其他好奇的开发人员一起参加我们在全球范围内的活动培训 。 有更多的知识要学习,还有许多参与Neo4j社区并与之互动的方法。 我们的网站也是一个很好的起点。
作者简介: Michael Hunger长期以来一直对软件开发充满热情。 他对开发软件,软件Craft.io,编程语言和改进代码的人员特别感兴趣。 在过去的几年中,他一直与Neo Technology合作开发Neo4j图形数据库。 作为Spring Data Neo4j的项目负责人,他帮助开发了该想法,使其成为对象图映射的便捷且完整的解决方案。 他还负责Neo4j云托管工作。 迈克尔一生中无处不在。 他的生活与他的家人和孩子有关,经营着咖啡店和合作空间,在基于文本的多用户地牢的深处玩得开心,在有无Lego的情况下进行了修补 。
这篇文章发表在6月版的《 JAX杂志》 – Graph Renaissance中。 对于该问题和其他问题, 请单击此处 。
翻译自: https://jaxenter.com/getting-started-with-neo4j-the-java-graph-database-106454.html
neo4j数据库与java