我的图表看起来像这样
介质 - [:firstChapter] - GT;第1章 - [:下一页第] - GT; chapter2_to_N
只有一个节点通过:firstChapter连接,然后可以跟随几个节点,通过:nextChapter连接
我尝试匹配通过关系连接的所有节点:firstChapter到medium或通过:nextChapter从一个章节连接到另一个
我试过的查询看起来像这样
start n=node(543) match n-[:firstChapter|nextChapter*]->m return m;
节点(543)是节点介质。 令人惊讶的是,此查询返回路径中的所有节点,即使节点未连接到n(=中节点) 如果我在nextChapter之后省略了*符号,则只返回第一个具有:firstChapter关系的节点(第1章),这似乎是正确的。
start n=node(543) match n-[:firstChapter|nextChapter*]->m return m;
为什么上面的查询返回节点未连接到n ?据我了解,*符号通常会返回无限数量关系的节点,对吗?
通过以下方式匹配路径的所有节点(仅一次)的最佳方法是什么:firstChapter或:nextChapter连接到起始节点?在这种情况下所有章节
上面的查询是为了这个目的,但我不认为输出是正确的......
编辑: 添加了一个图表来澄清。 如您所见,第一章可能只能通过:firstChapter, 所以仍然不清楚为什么上面的查询返回所有章节点
答案 0 :(得分:7)
尝试match p=n-[:firstChapter|nextChapter*]->m
查看p
是什么。希望这能提供一些关于它们如何连接的见解。
你最终可能会寻找的是:
start n=node(543)
match n-[:firstChapter|nextChapter*]->m
return collect(distinct m);
获取跟随n。
的不同章节点的集合更新 这是另一个 - 实际上没有测试它,但它可能让你更接近你想要的东西:
start n=node(543)
match n-[:firstChapter]->f-[:nextChapter*]-m
return f + collect(distinct m);
答案 1 :(得分:2)
使用*运算符,查询会查找两种关系类型的所有关系:firstChapter和:nextChapter(不仅仅是:nextChapter)。节点(543)的章节数据可能包含一些与不在543链中的章节点的关系,并且查询正在返回它们。
考虑使用type:nextChapter添加一个额外的关系,将起始节点连接到第一章,并检查章节中存在的关系。
然后运行:
start n=node(543)
match n-[:nextChapter*]->m
return m;
看看你是否还能得到额外的结果。如果是这样,你可以运行以下命令,每次碰到n,直到找到具有额外关系的节点 - (尽管我确定还有其他方法!)
start n=node(543)
match n-[:nextChapter*1..n]->m
return m;