Neo4j &引用;加上;关键字更改结果

Neo4j &引用;加上;关键字更改结果,neo4j,cypher,Neo4j,Cypher,问题1 MATCH (n:PC)-[r:C1|C2|U]->(n2) WHERE r.date IS NULL OR (r.date > 1 AND r.date < 15) WITH n,n2, reduce(t = 0, r in [x IN collect(r) WHERE type(x) = 'C1' or type(x) = 'C2'] | t + r.amount) as totalAmount1, reduce(t = 0, r in [x IN collec

问题1

MATCH (n:PC)-[r:C1|C2|U]->(n2) WHERE r.date IS NULL OR (r.date > 1 AND r.date < 15)
WITH n,n2, 
reduce(t = 0, r in [x IN collect(r) WHERE type(x) = 'C1' or type(x) = 'C2'] | t + r.amount) as totalAmount1, 
reduce(t = 0, r in [x IN collect(r) WHERE type(x) = 'U' ] | t + r.amount) as totalAmount2 
WHERE totalAmount1 >= 1291 AND totalAmount2 >= 1000
RETURN COUNT(*)
匹配(n:PC)-[r:C1 | C2 | U]->(n2),其中r.date为NULL或(r.date>1且r.date<15)
n,n2,
将(t=0,r in[x in collect(r)中的类型(x)='C1'或类型(x)='C2'])减少为总金额1,
将(t=0,r in[x in collect(r)中的类型(x)='U']| t+r.amount)减少为totalAmount2
其中totalAmount1>=1291和totalAmount2>=1000
返回计数(*)
问题2

MATCH (n:PC)-[r:C1|C2|U]->(n2) WHERE r.date IS NULL OR (r.date > 1 AND r.date < 15)
WITH n, 
reduce(t = 0, r in [x IN collect(r) WHERE type(x) = 'C1' or type(x) = 'C2'] | t + r.amount) as totalAmount1, 
reduce(t = 0, r in [x IN collect(r) WHERE type(x) = 'U' ] | t + r.amount) as totalAmount2 
WHERE totalAmount1 >= 1291 AND totalAmount2 >= 1000
RETURN COUNT(*)
匹配(n:PC)-[r:C1 | C2 | U]->(n2),其中r.date为NULL或(r.date>1且r.date<15)
有了n,
将(t=0,r in[x in collect(r)中的类型(x)='C1'或类型(x)='C2'])减少为总金额1,
将(t=0,r in[x in collect(r)中的类型(x)='U']| t+r.amount)减少为totalAmount2
其中totalAmount1>=1291和totalAmount2>=1000
返回计数(*)
如您所见,这两个查询彼此非常相似唯一的区别是,我在第二次查询中使用了带n的
,n2
,而不是带n的
我希望它们返回相同的结果

但是查询1返回0,其他查询返回113。为什么?怎么做


注意:数据库包含近700万个节点和1000万条边。

您应该阅读关于like
COLLECT
如何工作的文档,特别是关于“分组键”的信息

所有带有
或返回子句且不使用聚合函数的
术语都用作“分组键”,用于控制应聚合在一起的数据


查询1有2个分组键(
n
n2
),但查询2只有1个(
n
)。因此,您通常希望得到的聚合结果会有所不同。

您应该阅读关于like
COLLECT
如何工作的文档,尤其是关于“分组键”的信息

所有带有
或返回子句且不使用聚合函数的
术语都用作“分组键”,用于控制应聚合在一起的数据


查询1有2个分组键(
n
n2
),但查询2只有1个(
n
)。因此,您通常期望得到的聚合是不同的。

对于每n个,查询1只减少导致特定n2的路径

您的查询2每n个减少到任何节点的所有路径

因此,查询2的collect(r)中的路径数和条目数大于查询1

假设金额大于0,查询2的结果计数较高,WHERE子句将为其返回true


事实上,改变结果的不是WITH关键字,而是您提供的变量/占位符列表。

您的查询1每n只减少导致特定n2的路径

您的查询2每n个减少到任何节点的所有路径

因此,查询2的collect(r)中的路径数和条目数大于查询1

假设金额大于0,查询2的结果计数较高,WHERE子句将为其返回true


事实上,改变结果的不是WITH关键字,而是您提供的变量/占位符列表。

实际上,您将第一部分(WITH之前的匹配)的结果分组到第一个查询中的一个键上,第二个查询中的两个键上。这些查询有很大的不同。要看到实际结果返回所有可用列,您将了解其中的差异。在文档中,它说“WITH子句允许将查询部分链接在一起,将其中一个查询部分的结果作为下一个查询的起点或标准。”我不理解“分组”是如何发生的。即使发生这种情况,是否应该使用n、n2分组以获得更多的结果?实际上,您正在将第一部分的结果(在使用之前匹配)分组到第一个查询中的一个键上,并在第二个查询中分组到两个键上。这些查询有很大的不同。要看到实际结果返回所有可用列,您将了解其中的差异。在文档中,它说“WITH子句允许将查询部分链接在一起,将其中一个查询部分的结果作为下一个查询的起点或标准。”我不理解“分组”是如何发生的。即使发生这种情况,使用n,n2分组是否应该给出更多的结果?我认为我应该使用java或者应该有一种类似python的语言。这些数据库查询语言不够透明,我想我应该使用java或者python之类的语言。这些数据库查询语言不够透明。