首页 > 解决方案 > 阐明 neo4j 和 neo4j-driver 的不同行为

问题描述

我有一个只有几个节点和关系的基本数据库。当我在 Neo4j 提供的本地 Web 客户端上运行match (n) return n命令时,它会返回数据库中的所有节点和关系,如下图所示。

neo4j 网络客户端

但是,当我使用neo4j-driver模块在 node.js 项目中运行完全相同的命令时,它只返回三个节点,并且不包含这两个关系。

在稍微摆弄之后,我注意到要检索关系,我必须发出类似match (n)-[r]-(m) return *. 我的第一个问题是为什么会有这样的差异?本地 Web 客户端是否只是想为用户提供更多帮助?

此外,我发现返回的记录对象有点令人困惑。运行此match (n)-[r]-(m) return *命令会在 result.records 对象中返回 4 项,其中 2-2 项几乎成对相同。在简化的视图中,这是它返回的内容:

item 0: [Jack node, Jill node, Jack -> Jill relationship]
item 1: [Jill node, Jack node, Jack -> Jill relationship]
item 2: [George node, Jill node, George -> Jill relationship]
item 3: [Jill node, George node, George -> Jill relationship]

所以 result.records 对象的第 0 项和第 1 项仅在其元素的顺序上有所不同。第 2 项和第 3 项相同。

问题二是如果我想在网页上显示图表,我应该怎么做?在返回的所有不同组合中查找节点和关系的唯一 ID?

问题三:也许有更好的方法来实现我想要做的事情?

标签: node.jsneo4jcypherneo4j-driver

解决方案


Neo4j Web 浏览器确实只是想提供帮助,如果节点之间存在关系,可视化将连接节点(顺便说一句,可以选择关闭此行为)。但是,如果您不要求它们,结果集将不包含那些(因为它不应该)。查看浏览器中的其他响应选项卡(表格、文本、代码)以查看实际结果集。

此查询可能会帮助您:

match p=(n)-[r]-(m) return p

但是,是的,您是对的,您必须在您的应用程序中解压缩结果才能进行自己的解释。这是一个你得到你所要求的问题的例子,很多 Neo4j 用户都面临着这个问题。这是因为 Cypher 可以返回很多不同的东西(表格结果、节点、节点和关系、路径、子图……),并且驱动程序必须提供所有这些东西。

查看浏览器中的代码选项卡,了解您的应用程序必须使用的内容(实际获得的内容取决于您选择的应用程序语言)。这不是很困难,但确实需要一点时间来适应。

希望这可以帮助。

问候,汤姆

PS 双倍的结果是预期与这样的通用查询。Neo4j 进行模式匹配,您的模式在关系上没有方向,也没有标签或关系类型。这将返回相当多的匹配项,例如 (jill)-[:nended]-(jack) 但显然它也匹配 (jack)-[:nended]-(jill)。两者都匹配模式。使用 DISTINCT 可能会有所帮助,但您确实应该在模式中更加明确。


推荐阅读