【问题标题】:Combine nodes from more MATCHes into single variable将来自更多 MATCH 的节点组合成单个变量
【发布时间】:2014-03-07 00:23:55
【问题描述】:

使用 neo4j 社区版 2.x。在 Cypher 中,我需要以(两种)不同的方式匹配节点,然后将这(两组)匹配节点组合成一个集合(一个变量名)。该集合随后将用于进一步的操作。

naive graph example(我无法发布图片)

我想查找有关松鼠的所有知识,包括她所属的小组所共享的知识。 (例子是虚构的)

我想像这样:

MATCH (u:User{username:'squirrel'}), (:User{username:'squirrel'})<-[:MEMBER]-(g:Group)
WITH "COMBINATION OF u AND g" AS ug
MATCH (ug)-[:KNOW_HOW]->(k:Knowledge)
RETURN k.type

结果应该是“坚果”和“逃脱掠食者”。

代替“u 和 g 的组合”,我尝试了 collect(u)+collect(g)、EXTRACT 等的变体,但没有成功。

到目前为止,我发现的最简单的工作方式是使用 UNION。

MATCH (u:User{username:'squirrel'})-[:KNOW_HOW]->(k:Knowledge)
RETURN k.type
UNION
MATCH (u:User{username:'squirrel'})<-[:MEMBER]-(:Group)-[:KNOW_HOW]->(k:Knowledge)
RETURN k.type

这可能会解决这个简单的示例,但不适用于更复杂的查询。我为更普遍的问题寻求解决方案:匹配几组节点,将它们粘合到单个集合(单个变量)并继续这个新集合。

有什么想法吗?我错过了一些基本的东西吗?或者这是不可能的?谢谢!

grokbase 上可能有类似的东西。

编辑:

使用this hacky solution to similar question,我能够通过从节点集合中提取内部 id 来解决问题:

MATCH (u:User{username:'squirrel'}), (:User{username:'squirrel'})<-[:MEMBER]-(g:Group)
WITH [x in collect(u)+collect(g)|id(x)] as collectedIds MATCH (ug) WHERE id(ug) in collectedIds
MATCH (ug)-[:KNOW_HOW]->(k:Knowledge)
RETURN k.type

可以做得更好吗?

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    至少从 Neo4j 3.0 开始,您可以使用可变长度模式匹配来解决这个问题。只需将最小长度显式设置为 0 并将标签测试移动到单独的 WHERE 子句:

    MATCH (:User {username:'squirrel'}) <-[:MEMBER*0..1]- (ug)
    WHERE ug:User OR ug:Group
    WITH ug
    MATCH (ug)-[:KNOW_HOW]->(k:Knowledge)
    RETURN k.type
    

    【讨论】:

      【解决方案2】:

      不确定一般情况,但是对于这种特定情况,您可以尝试将两种模式组合成一个,如下所示,

      MATCH (u:User{username:'squirrel'})<-[:MEMBER*0..1]-()-[:KNOW_HOW]->(k:Knowledge)
      RETURN k.type
      

      【讨论】:

        【解决方案3】:

        目前我发现的唯一通用解决方案:

        • 匹配所需的起点(使用不同的名称)
        • 收集起点的内部ID
        • 将起点与收集的 id 匹配(现在起点只有一个名称)
        • 对起点做任何你需要做的动作

        现在是代码本身:

        MATCH (u:User{username:'squirrel'}), (:User{username:'squirrel'})<-[:MEMBER]-(g:Group)
        WITH [x in collect(u)+collect(g)|id(x)] as collectedIds MATCH (ug) WHERE id(ug) in collectedIds
        MATCH (ug)-[:KNOW_HOW]->(k:Knowledge)
        RETURN k.type
        

        【讨论】:

          猜你喜欢
          • 2011-08-25
          • 2019-04-11
          • 2021-10-31
          • 2021-09-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多