【问题标题】:cypher match where each collection element IN another collection密码匹配另一个集合中的每个集合元素
【发布时间】:2014-01-08 14:05:05
【问题描述】:

在 cypher id 中,喜欢使用类似的方法返回仅包含一组已知有效关系名称的所有路径

MATCH (i:VALID_RELATIONSHIPS), p=(n:MY_DOMAIN)-[rels*1..5]-(m) 
WHERE n.NAME='start_node' AND 
      ALL(t in rels WHERE type(t) IN extract(x IN i | x.RELATIONSHIP_NAME) ) 
RETURN nodes(p);

所以ALL t IN rels应该包含在VALID_RELATIONSHIPS的集合中

但是这会返回一个异常i already defined with conflicting node type collection<any>

我在这里误解了什么吗?该算法应该遍历路径中的所有rels(我假设它是一个集合),并且对于每一个;检查 type() 是否包含在有效的关系集合 i

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    这是节点类型:i

    为什么不将有效的关系名称作为参数传入?

    MATCH p=(n:MY_DOMAIN)-[rels*1..5]-(m) 
    WHERE n.NAME='start_node' AND 
          ALL(t in rels WHERE type(t) IN {valid_rel_names} ) 
    RETURN nodes(p);
    

    否则你必须先将你的 i 聚合到一个集合中

    MATCH (i:VALID_RELATIONSHIPS)
    WITH collect(i) as valid_rels
    MATCH p=(n:MY_DOMAIN)-[rels*1..5]-(m) 
    WHERE n.NAME='start_node' AND 
          ALL(t in rels WHERE type(t) IN extract(x IN valid_rels | x.RELATIONSHIP_NAME) ) 
    RETURN nodes(p);
    

    或者已经提前提取了相关文件

    MATCH (i:VALID_RELATIONSHIPS)
    WITH collect(i.RELATIONSHIP_NAME) as valid_rel_names
    MATCH p=(n:MY_DOMAIN)-[rels*1..5]-(m) 
    WHERE n.NAME='start_node' AND 
          ALL(t in rels WHERE type(t) IN valid_rel_names ) 
    RETURN nodes(p);
    

    【讨论】:

    • 非常感谢迈克尔。所以我认为我是一个集合的假设似乎是完全错误的。那么为什么 rels 是一个集合而 i 不是呢?
    猜你喜欢
    • 1970-01-01
    • 2012-11-24
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    • 2021-12-08
    • 2013-01-10
    • 1970-01-01
    相关资源
    最近更新 更多