【问题标题】:cypher: how to return distinct relationship types?cypher:如何返回不同的关系类型?
【发布时间】:2013-12-25 05:59:11
【问题描述】:

如何从cypher中的所有路径返回不同的关系类型?

查询示例:

MATCH p=(a:Philosopher)-[*]->(b:SchoolType)
RETURN DISTINCT EXTRACT( r in RELATIONSHIPS(p)| type(r) ) as RelationshipTypes

这会为每个路径 p 返回一个集合。

我想返回一个集合,其中包含所有集合中不同的关系类型。

这是运行查询的图表要点的链接-

http://gist.neo4j.org/?7851642

【问题讨论】:

    标签: graph neo4j relationship cypher


    【解决方案1】:

    您可能首先将匹配路径上的所有关系收集到集合“allr”,然后从所有关系的集合中获取不同类型(r)的集合,

    MATCH p=(a:Philosopher)-[rel*]->(b:SchoolType) 
    WITH collect(rel) AS allr 
    RETURN Reduce(allDistR =[], rcol IN allr | 
                  reduce(distR = allDistR, r IN rcol | 
                         distR +  CASE WHEN type(r) IN distR  THEN []  ELSE type(r) END 
                        )
                  )
    

    注意,集合“allr”中的每个元素“rcol”又是每个匹配路径上关系的集合

    【讨论】:

    • 这非常有效。如果关系类型存在,我没有考虑使用多个 reduce 来执行嵌套循环之类的处理或使用 CASE 附加一个空集合。谢谢。
    • 我宁愿返回单个集合而不是集合的集合。我这样做的尝试产生了令我惊讶的结果,但我还没有找到解决方案。这不是问题,我对查询很满意。但这对我来说是一个谜。在嵌入模式下,如果我 HEAD(col of col) 我得到一个元素而不是第一个集合。如果我做一个范围 (col of col)[0..1000] 我仍然会得到一个集合。想法?
    • 我用集合“allr”尝试了 head 函数,它确实返回了一个集合而不是单个元素。也许是因为不同的版本?我尝试使用 2.0.0-M05 版本。
    • 我正在使用 2.0.0-RC 当我前往“allr”时,我得到一个集合集合,其中仅包含集合中的第一个集合。但这仍然是一个集合。我得到 [[Relationship[5],Relationship[11]]] 而不是 [Relationship[5],Relationship[11]]
    猜你喜欢
    • 2015-10-07
    • 2014-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多