【问题标题】:cypher to combine nodes and relationships into a single columncypher 将节点和关系组合到一个列中
【发布时间】:2017-04-24 14:26:39
【问题描述】:

所以作为this question的并发症,我基本上想做

MATCH (n:TEST) OPTIONAL MATCH (n)-[r]->() RETURN DISTINCT n, r

我想将 n 和 r 作为一列返回,没有重复值。但是,运行

MATCH (n:TEST) OPTIONAL MATCH (n)-[r]->() UNWIND n+r AS x RETURN DISTINCT x

给出“类型不匹配:预期的列表但为关系(第 1 行,第 47 列)”错误。而这个查询

MATCH (n:TEST) RETURN DISTINCT n UNION MATCH ()-[n]->() RETURN DISTINCT n

将节点和关系放在同一列中,但第一次匹配的上下文在后半段丢失。

那么如何将所有匹配的节点和关系作为一个最小列表返回?

更新:

这是我正在使用的答案查询的最终修改版本

MATCH (n:TEST) OPTIONAL MATCH (n)-[r]->() RETURN n {.*, rels:collect(r {properties:properties(r), id:id(r), type:type(r), startNode:id(startNode(r)), endNode:id(endNode(r))})} as n

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    有几种方法可以处理此问题,具体取决于您是希望将它们保存在列表中,还是在地图中,或者您是否希望节点的地图投影包含其关系。

    如果您使用的是 Neo4j 3.1 或更新版本,那么map projection 可能是最简单的方法。使用它,我们可以输出节点的属性并将其关系包含为收集的属性:

    MATCH (n:TEST) 
    OPTIONAL MATCH (n)-[r]->() 
    RETURN n {.*, rels:collect(r)} as n
    

    如果您希望每一行都成为其自己的节点配对和列表中的单个关系,您可以这样做:

    ...
    RETURN [n, r] as pair
    

    作为地图:

    ...
    RETURN {node:n, rel:r} as pair
    

    编辑

    就从每个关系返回更多数据而言,如果您检查“代码结果”选项卡,您会看到 ID、关系类型以及开始和结束节点 ID 已包含在内,并且可以从您的后端代码访问。

    但是,如果您想显式返回此数据,那么我们只需将其包含在查询中,为每个关系使用另一个地图投影:

    MATCH (n:TEST) 
    OPTIONAL MATCH (n)-[r]->() 
    RETURN n {.*, rels:collect(r {.*, id:id(r), type:type(r), startNode:startNode(r), endNode:endNode(r)})} as n
    

    【讨论】:

    • 最后2个将它们合并为1个列表,但只是格式变化,返回节点信息是关系时间。第一个查询做了我想要的,但是关系标签(和结束节点)丢失了。有没有办法让整个关系节点成为价值的一部分? (我需要关系中的 id、开始、结束、标签/类型和属性)
    • 好的,所以我可以在开始和结束节点上使用 id() 函数(这些节点也会被返回,所以更多的是重复信息);最后一件事。类型字段可能被重载,因此我需要将属性向下推送到“属性”字段中以保持其清洁。看来我不能只做“properties:.*”那么我该如何解决呢?
    • 在这种情况下,我们将从地图投影中删除.*,并添加一个properties 字段:r {properties:properties(r), ...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多