模式理解列表的嵌套列表/排序顺序

时间:2019-03-22 19:06:50

标签: neo4j cypher

Neo4j:嵌套和排序订单列表理解结果的正确语法是什么?

我的记录有媒体节点,每个节点都链接到更改媒体的用户。我正在尝试收集有关我的记录的所有信息。

简单的列表理解非常有用:

MATCH r
RETURN r {.*, Media: [(r)-[:HAS_MEDIA]->(m:Media) | m {.URL, .Type, .Order}]}

这是我的问题:

1)如果媒体很多,如何按.Order排序m列表?

2)我还想收集有关m的信息,该信息可通过其他节点获得。所以我尝试了嵌套:

MATCH r
RETURN r {.*, Media: [(r)-[:HAS_MEDIA]->(m:Media) | m {.URL, .Type, .Order,  [(m:Media-[t:MODIFIED_BY]->(u) | u.UserID] }]}

这在第一个嵌套方括号中引发语法错误。能做到吗?

理想情况下,我想收集的不只是u.UserID,还包括t关系属性.DT。

3)什么时候/如果我可以使用,与1)相同的问题-如何按.DT对u列表进行排序?

将非常感谢任何指针!

---------更新cybersam回答后: 是!正如Cyber​​sam所说,我需要添加新的属性名称。谢谢!

 MATCH (r)
 RETURN r {.*, Media: [(r)-[:HAS_MEDIA]->(m:Media) | m {.URL, .Type, .Order,  UserID: [(m)-[:MODIFIED_BY]->(u) | u.UserID] }]} 

MATCH (r)
RETURN r {.*, Media: [(r)-[:HAS_MEDIA]->(m:Media) | m {.URL, .Type, .Order,  UserID: [(m)-[t:MODIFIED_BY]->(u) | u {.UserID, DT: t.DT}] }]} 

我需要研究一下订单调用,但是我不相信ORDER BY r.Order在最后会起作用。我只返回一个r节点。在该r数组中,我想对子项进行排序(因此Media按.Order排序,User按t.DT排序)。

1 个答案:

答案 0 :(得分:0)

这对您有用吗?

MATCH (r)
RETURN r {
  .*, Media: [(r)-[:HAS_MEDIA]->(m:Media) |
  m {.URL, .Type, .Order,  UserID: [(m)-[:MODIFIED_BY]->(u) | u.UserID] }]}
ORDER BY r.Order;

在地图投影中,每个属性都需要一个名称,因此我使用UserID作为内部模式理解结果的名称。

[已更新]

以下查询可以解决您的更新问题。地图投影和模式理解的语法不支持对包含列表的排序。

MATCH (r)-[:HAS_MEDIA]->(m:Media)
WITH r, m ORDER BY m.Order
MATCH (m)-[t:MODIFIED_BY]->(u)
WITH r, m, u{.UserID, DT: t.DT} ORDER BY u.DT
WITH r, m{.URL, .Type, .Order, User: COLLECT(u)}
RETURN r {.*, Media: COLLECT(m)}