【问题标题】:Neo4J Cypher Match by multiple relationship types - strange behaviorNeo4J Cypher 通过多种关系类型匹配 - 奇怪的行为
【发布时间】:2013-08-12 16:18:57
【问题描述】:

我的图表是这样的

medium-[: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(=medium 节点) 如果我在 nextChapter 之后省略 * 符号,则仅返回具有 :firstChapter 关系的第一个节点(第 1 章),这似乎是正确的。

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

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

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

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

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

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    试试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);
    

    【讨论】:

    • 这并没有提供问题的答案。要批评或要求作者澄清,请在其帖子下方发表评论。
    • 他们问“为什么上面的查询返回未连接到 n 的节点?”,我试图回答这部分问题。
    • 我已更新答案以提供更多信息。抱歉,我很着急,没有提供太多解释。
    • 您是否尝试返回路径,看看它的连接位置?
    • 是的,我做到了,而且似乎是正确的。也许我只是误解了查询的含义。我认为它匹配 firstChapter 关系和连接到起始节点(543)的 nextChapter 无限长度的路径。它的作用似乎是:匹配一条无限长度的路径,该路径在途中具有 firstChapter 或 nextChapter 关系。所以*号似乎会影响整个表达式,而不仅仅是nextChapter。我说的对吗?
    【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-05
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多