命名关系会改变结果?
Naming relationships changes the results?
考虑两个查询:
[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
唯一的区别是 xa:
和 xd:
,关系别名。
结果差异更大:
- 查询 1 有 32 行。每个人至少有2排,有的有6排。
- 查询 2 有 3 行。三个都不一样。
- 别名 1 XOR 另一个甚至有不同的结果:4 或 10 行。
为什么?没有聚合。关系别名未使用。为什么它会更改查询?
数据库是 https://app.graphenedb.com/ 上的免费示例 db 'Movie graph'(但它是私有的)。
您混淆了区分变量和关系类型的语法。在你的第一场比赛中,因为没有 :
字符,ACTED_IN
和 DIRECTED
是 变量 ,匹配任何关系类型,并丢掉你的匹配的结果。
: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)
考虑两个查询:
[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
唯一的区别是 xa:
和 xd:
,关系别名。
结果差异更大:
- 查询 1 有 32 行。每个人至少有2排,有的有6排。
- 查询 2 有 3 行。三个都不一样。
- 别名 1 XOR 另一个甚至有不同的结果:4 或 10 行。
为什么?没有聚合。关系别名未使用。为什么它会更改查询?
数据库是 https://app.graphenedb.com/ 上的免费示例 db 'Movie graph'(但它是私有的)。
您混淆了区分变量和关系类型的语法。在你的第一场比赛中,因为没有 :
字符,ACTED_IN
和 DIRECTED
是 变量 ,匹配任何关系类型,并丢掉你的匹配的结果。
: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)