Neo4J Cypher由多种关系类型匹配 - 奇怪的行为

时间:2013-08-12 16:18:58

标签: neo4j cypher

我的图表看起来像这样

介质 - [: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, 所以仍然不清楚为什么上面的查询返回所有章节点 Graph Diagram

2 个答案:

答案 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;