阐明 neo4j 和 neo4j-driver 的不同行为

Clarify different behaviour of neo4j and neo4j-driver

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

然而,当我 运行 使用 neo4j-driver 模块在 node.js 项目中使用完全相同的命令时,它只 returns两个关系中的三个节点和none都包含在内。

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

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

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?

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

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

此查询可能对您有所帮助:

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

但是,是的,你是对的,你必须在你的应用程序中 解压 结果才能做出你自己的解释。这是相当多 Neo4j 用户面临的 you get what you asked 问题的一个例子。这是因为 Cypher 可以 return 很多不同的东西(表格结果、节点、节点和关系、路径、子图......)并且驱动程序必须提供所有这些东西。

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

希望对您有所帮助。

问候,汤姆

P.S。对于此类通用查询,预期结果会翻倍。 Neo4j 进行模式匹配,您的模式在关系上没有方向,也没有标签或关系类型。这将 return 相当多的匹配,例如 (jill)-[:nominated]-(jack) 但显然它也匹配 (jack)-[:nominated]-(jill)。两者都符合模式。使用 DISTINCT 可能会有所帮助,但您确实应该在模式中更加明确。