3

我的图表看起来像这样

中-[:firstChapter]->chapter1-[:nextChapter]->chapter2_to_N

只有一个节点通过 :firstChapter 连接,然后可能有几个节点通过 :nextChapter 连接

我试图匹配通过关系连接的所有节点 :firstChapter 到 medium 或通过 :nextChapter 从一章连接到另一章

我试过的查询看起来像这样

start n=node(543) match n-[:firstChapter|nextChapter*]->m return m;

node(543) 是节点介质。令人惊讶的是,此查询返回路径中的所有节点,即使节点未连接到 n(= 中节点)如果我在 nextChapter 之后省略 * 符号,则仅返回具有 :firstChapter 关系的第一个节点(第 1 章),这似乎是正确的。

start n=node(543) match n-[:firstChapter|nextChapter*]->m return m;

为什么上面的查询返回未连接到 n的节点?据我了解, * 符号通常会返回无限数量的关系的节点,对吧?

将通过 :firstChapter 或 :nextChapter 连接到起始节点的路径的所有节点(仅一次)匹配的最佳方法是什么?在这种情况下,所有章节

上面的查询服务于这个目的,但我不认为输出是正确的......

编辑:添加了一个图表来澄清。如您所见,第一章可能只能通过:firstChapter到达,所以目前还不清楚,为什么上面的查询返回所有章节节点 图表

4

2 回答 2

8

试着做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);
于 2013-08-12T17:13:46.813 回答
2

使用 * 运算符,查询会为两种关系类型查找沿线的所有关系,:firstChapter 和 :nextChapter(不仅仅是 :nextChapter)。您的 node(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;
于 2013-08-12T22:59:29.863 回答