node.js - 阐明 neo4j 和 neo4j-driver 的不同行为
问题描述
我有一个只有几个节点和关系的基本数据库。当我在 Neo4j 提供的本地 Web 客户端上运行match (n) return n
命令时,它会返回数据库中的所有节点和关系,如下图所示。
但是,当我使用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?
问题三:也许有更好的方法来实现我想要做的事情?
解决方案
Neo4j Web 浏览器确实只是想提供帮助,如果节点之间存在关系,可视化将连接节点(顺便说一句,可以选择关闭此行为)。但是,如果您不要求它们,结果集将不包含那些(因为它不应该)。查看浏览器中的其他响应选项卡(表格、文本、代码)以查看实际结果集。
此查询可能会帮助您:
match p=(n)-[r]-(m) return p
但是,是的,您是对的,您必须在您的应用程序中解压缩结果才能进行自己的解释。这是一个你得到你所要求的问题的例子,很多 Neo4j 用户都面临着这个问题。这是因为 Cypher 可以返回很多不同的东西(表格结果、节点、节点和关系、路径、子图……),并且驱动程序必须提供所有这些东西。
查看浏览器中的代码选项卡,了解您的应用程序必须使用的内容(实际获得的内容取决于您选择的应用程序语言)。这不是很困难,但确实需要一点时间来适应。
希望这可以帮助。
问候,汤姆
PS 双倍的结果是预期与这样的通用查询。Neo4j 进行模式匹配,您的模式在关系上没有方向,也没有标签或关系类型。这将返回相当多的匹配项,例如 (jill)-[:nended]-(jack) 但显然它也匹配 (jack)-[:nended]-(jill)。两者都匹配模式。使用 DISTINCT 可能会有所帮助,但您确实应该在模式中更加明确。
推荐阅读
- c# - 将 json 定向到 StructureMap 序列化字节 []
- vb.net - .NET 中的互相关
- javascript - 我想从 vuejs 和 laravel 的页面中删除一个脚本标签
- excel - VBA 循环用于分割文本,速度很慢(可能没有响应) 需要一些帮助来改进吗?
- java - java.lang.NoClassDefFoundError: org/springframework/security/converter/RsaKeyConverters
- python - Python:找到我的线的方程,Logit
- java - FindById 查询方法“无法在此 ManagedType 上找到具有给定名称 [id] 的属性”
- php - 在 Laravel 中找到交叉点的最佳方法
- algorithm - “zlib: inflate error = -3 (data error)” 自定义 png 实现
- google-apps-script - Google Docs 脚本:通过 Marketplace 在我的帐户中共享脚本/未经审查的脚本(替换以前的 chrome 插件商店)