Neo4j cypher查询失败,“不知道如何比较”

时间:2015-04-23 13:33:59

标签: neo4j cypher

我有一个简单的测试图,我在上面运行此查询:

MATCH p = (l)-[*1..1]->(start)-[*3..3]->(r) where id(start) = 1101 return l,r

这曾经在Neo4j 2.1中运行,但在升级到2.2后,它不再发生,给出了这个错误:

Don't know how to compare that. Left: [:has_participant[1027]{}] ($colon$colon); Right: :sampled[1025]{} (RelationshipProxy)

此查询有效:

MATCH p = (l)-[*1..1]->(start)-[*1..1]->(r) where id(start) = 1101 return l,start,r

导致此可视化:

左边节点是(l),John节点是(start),绿色节点是(r)。

如果我双击绿色节点,然后双击出现的节点,我就可以到达我想要的(r)节点,这些节点标记为通道:

这棵树中的每个“级别”都有不同的关系; 'has_participants'连接(l)到(开始),'samples'连接(开始)到绿色节点。 'prepared'将绿色连接到蓝色,'sequenced'将蓝色连接到粉红色。

给定(开始),如何在不遇到错误的情况下到达(l)和上面显示的2个粉红色Lane节点?我实际上要做的是一个通用的“给我(至少3步之遥)的(开始)后代节点”,所以我不能使用采样 - >准备 - >顺序关系路径的知识。

以下是EXPLAIN对问题查询的结果:

enter image description here

查询的这个变体有效:

MATCH p = (l)-->(start)-[*3..3]->(r) where id(start) = 1101 return l,r

但为什么原始查询停止工作?如果我想在左边做2..2怎么办?

编辑:事实上,更奇怪的是这些工作:

MATCH p = (l)-[*0..1]->(start)-[*3..3]->(r) where id(start) = 1101 return l,r
MATCH p = (l)-[*1..2]->(start)-[*3..3]->(r) where id(start) = 1101 return l,r

左边只有1..1失败。

1 个答案:

答案 0 :(得分:0)

你真的不应该使用id()函数进行查询 - 它们可以改变。

如果你这样做会怎样?

MATCH p =(l) - [* 1..1] - >(start {name:“John”}) - [* 3..3] - >(r)return l,r

您可能希望在“开始”节点的标签/属性上添加索引。