澄清neo4j和neo4j-driver

时间:2018-05-30 07:38:15

标签: node.js neo4j cypher neo4j-driver

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

neo4j web client

但是,当我使用 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?

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

1 个答案:

答案 0 :(得分:2)

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

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

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

但是,是的,你是正确的,你必须解包你的应用程序中的结果,以便能够做自己的解释。这是一个很好的Neo4j用户面临的你得到了你所要求的问题的情况。这是因为Cypher可以返回相当多的不同内容(表格结果,节点,节点和关系,路径,子图......),驱动程序必须提供所有这些内容。

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

希望这有帮助。

问候,汤姆

P.S。使用此类通用查询可以预期结果中的双打。 Neo4j进行模式匹配,你的模式没有关系方向,也没有标签或关系类型。这将返回相当多的比赛,例如(jill) - [:nominated] - (jack)但显然它也匹配(jack) - [:nominated] - (jill)。两者都匹配模式。使用DISTINCT可能会有所帮助,但你真的应该在模式中更明确。