命名关系会改变结果吗?

时间:2016-10-21 15:20:00

标签: neo4j graph-databases

考虑两个问题:

import lib.helper

唯一的区别是lib.helper.something() [1] MATCH (p1:Person)-[ACTED_IN]->(m1:Movie), (p2:Person)-[DIRECTED]->(m1) WHERE p1 = p2 RETURN p1.name [2] MATCH (p1:Person)-[xa:ACTED_IN]->(m1:Movie), (p2:Person)-[xd:DIRECTED]->(m1) WHERE p1 = p2 RETURN p1.name ,关系别名。

结果的差异要大得多:

  • 查询1有32行。每个人至少有2行,有些人有6行。
  • 查询2有3行。所有3都不同。
  • 别名1 XOR另一个甚至有不同的结果:4或10行。

为什么呢?没有聚合。关系别名未使用。为什么要更改查询?

数据库是https://app.graphenedb.com/上的免费示例db'电影图'(但它是私有的)。

1 个答案:

答案 0 :(得分:2)

您混淆了将变量与关系类型区分开来的语法。在第一场比赛中,由于没有:个字符,ACTED_INDIRECTED变量,与任何关系类型匹配,并丢弃匹配的结果。

您想要使用

:ACTED_IN:DIRECTED,因为前缀:将它们表示为关系类型。

它与节点标签和变量的工作方式相同,前缀为:的标记表示节点标签,冒号用作变量之前的标记(或者如果不存在: ,没有标签,整个东西都是变量。

修改

以下是关系语法的一些示例,指出相关部分:

在这一个中,ACTED_IN是p1和m1之间所有关系的变量。

(p1:Person)-[ACTED_IN]->(m1:Movie)

在这一个中,:ACTED_IN是p1和m1之间的关系类型,并且不存在变量

(p1:Person)-[:ACTED_IN]->(m1:Movie)

在这一个中,:ACTED_IN是p1和m1之间的关系类型,' a'是绑定到匹配关系的变量。

(p1:Person)-[a:ACTED_IN]->(m1:Movie)

这个语法无效,因为在:之后必须有一个令牌作为关系类型。

(p1:Person)-[a:]->(m1:Movie)