Cypher/Neo4j:如何匹配n个"consecutive"个节点相关的节点
Cypher/Neo4j: How to match nodes related to n "consecutive" nodes
我正在尝试匹配图表中的房源可用性(类似于 Airbnb)。
- 该图每个日期有 1 个节点,连续的日子由 NEXT_DAY 边连接。
- 列表通过 AVAILABLE 边(如果可用)链接到日期节点
我正在尝试编写一个查询,其中 returns 从 start_date 到 end_date 可用的所有列表。
我知道以下 FOREACH 语法不正确,但我可能会帮助提供一般思路:
MATCH period=(a)-[:NEXT_DAY*]->(c)
WHERE a.date="2013-01-20" AND c.date="2013-01-24"
MATCH (listing:Listing)-[:AVAILABLE]->(d:Date)
FOREACH (d IN nodes(period))
RETURN listing
奖励问题:如果我想根据查询的可用性按比例对列表进行评分(例如,如果列表在整个期间可用则为 100%,如果在整个期间可用则为 50%)只有一半的时间可用)?
提前致谢:)
本杰明
您可以使用 UNWIND
从您的日期路径获取节点并将它们 MATCH
到 Listing
。
MATCH period=(a)-[:NEXT_DAY*]->(c)
WHERE a.date="2013-01-20" AND c.date="2013-01-24"
// UNWIND gets a collection of ndoes and transforms them to single/matchable nodes
UNWIND nodes(period) as nodes_in_period
MATCH (nodes_in_period)<-[:AVAILABLE]-(listing:Listing)
RETURN listing
对于奖金问题:如果我没猜错,你可以计算从 Listing
到 Date
的 AVAILABLE
关系的数量,并将其与 [= 的数量进行比较17=] 您经期的节点。 OPTIONAL MATCH
可能有帮助:
MATCH period=(a)-[:NEXT_DAY*]->(c)
WHERE a.date="2013-01-20" AND c.date="2013-01-24"
UNWIND nodes(period) as nodes_in_period
OPTIONAL MATCH (nodes_in_period)<-[a:AVAILABLE]-(listing:Listing)
// return the listing, the number of available relationships
// and the number of days in period
RETURN listing, count(a), count(nodes_in_period)
我正在尝试匹配图表中的房源可用性(类似于 Airbnb)。
- 该图每个日期有 1 个节点,连续的日子由 NEXT_DAY 边连接。
- 列表通过 AVAILABLE 边(如果可用)链接到日期节点
我正在尝试编写一个查询,其中 returns 从 start_date 到 end_date 可用的所有列表。
我知道以下 FOREACH 语法不正确,但我可能会帮助提供一般思路:
MATCH period=(a)-[:NEXT_DAY*]->(c)
WHERE a.date="2013-01-20" AND c.date="2013-01-24"
MATCH (listing:Listing)-[:AVAILABLE]->(d:Date)
FOREACH (d IN nodes(period))
RETURN listing
奖励问题:如果我想根据查询的可用性按比例对列表进行评分(例如,如果列表在整个期间可用则为 100%,如果在整个期间可用则为 50%)只有一半的时间可用)?
提前致谢:)
本杰明
您可以使用 UNWIND
从您的日期路径获取节点并将它们 MATCH
到 Listing
。
MATCH period=(a)-[:NEXT_DAY*]->(c)
WHERE a.date="2013-01-20" AND c.date="2013-01-24"
// UNWIND gets a collection of ndoes and transforms them to single/matchable nodes
UNWIND nodes(period) as nodes_in_period
MATCH (nodes_in_period)<-[:AVAILABLE]-(listing:Listing)
RETURN listing
对于奖金问题:如果我没猜错,你可以计算从 Listing
到 Date
的 AVAILABLE
关系的数量,并将其与 [= 的数量进行比较17=] 您经期的节点。 OPTIONAL MATCH
可能有帮助:
MATCH period=(a)-[:NEXT_DAY*]->(c)
WHERE a.date="2013-01-20" AND c.date="2013-01-24"
UNWIND nodes(period) as nodes_in_period
OPTIONAL MATCH (nodes_in_period)<-[a:AVAILABLE]-(listing:Listing)
// return the listing, the number of available relationships
// and the number of days in period
RETURN listing, count(a), count(nodes_in_period)