我有一个电影和数月的发布数据库。电影通过[:released]
连接到几个月。每个月都通过[:NEXT]
与另一个月相连。
结构如下:
1->2->3->4..->12->1->2->..
在时间树中
(movie{title:'Matrix'})-[:released]->(month)
现在我在变量p
中拥有所有这几个月的路径。 Nodes(p)
返回所有月份。
我现在想要在p
中返回与每个月相关的所有电影。有人可以帮助我吗?
[已包含来自@Shiva的详细信息]
实际上,查询是这样的:
match
startPath=(root)-[:HAS_Year]->(year1:Year{year:1950})-[:HAS_MONTH]->(startLeaf:Month{month:1}),
endPath = (root)-[:HAS_Year]->(year2:Year{year:1951})-[:HAS_MONTH]->(endLeaf:Month{month:12}),
p=(startLeaf)-[:NEXT*0..]->(endLeaf)
最后我有路径“p”,现在我想检索与路径中月份节点关联的所有电影节点。我不太确定如何获取它们我实际上是在尝试查询时间树模型并检查执行时间的任何差异等等。
答案 0 :(得分:0)
[增订]
这应该适合你:
MATCH
(root)-[:HAS_Year]->(:Year {year:1950})-[:HAS_MONTH]->(start:Month {month:1}),
(root)-[:HAS_Year]->(:Year {year:1951})-[:HAS_MONTH]->(end:Month {month:12}),
p=(start)-[:NEXT*0..]->(end)
WITH NODES(p) AS months
UNWIND months AS month
OPTIONAL MATCH (month)<-[:released]-(movie)
RETURN month, COLLECT(movie) AS movies;
正如@NicoleWhite建议的那样,有更简单的解决方案。如果所有Month
个节点都包含一个timestamp
属性,它将年份和日期信息组合在一起,如下所示:
“2015-01”,那么查询可能就是这样:
MATCH (movie:Movie)-[:released]->(month:Month)
WHERE month.timestamp >= "1950-01" AND month.timestamp <= "1951-12"
RETURN month, COLLECT(movie) AS movies
ORDER BY month.timestamp;
如果您在时间戳上创建索引:
CREATE INDEX ON :Month(timestamp);
然后你可以提高查询效率(但你现在必须告诉Cypher使用索引):
MATCH (movie:Movie)-[:released]->(month:Month)
USING INDEX month:Month(timestamp)
WHERE month.timestamp >= "1950-01" AND month.timestamp <= "1951-12"
RETURN month, COLLECT(movie) AS movies
ORDER BY month.timestamp;