返回节点(如果连接到节点集,每个节点都有一个特定值)

时间:2018-07-18 08:36:24

标签: neo4j cypher

我的用户可以将其可用性提供给其他用户进行预订,获得以下信息:

(u:User {Id = "1"})-[:USER_AVAILABILITY]->(a:Availability {Date = "2018-07-18", Booked = false})

用户说自己有空的每一天都可以有一个节点可用性。我想检查用户是否可用,例如:“ 2018-07-18”,“ 2018-07-19”,“ 2018-07-20”。因此,我需要检查用户是否具有与节点日期值列表相关的所有节点。可以这样做吗?

我正在使用neo4j的3.2.5版本。

我尝试了以下查询:

MATCH (u:User) WHERE u.Id = '1'
MATCH (u)-[:USER_AVAILABILITY]-(a:Availability)
WHERE a.Date = '2018-07-18'
MATCH (u)-[:USER_AVAILABILITY]-(a2:Availability)
WHERE a2.Date = '2018-07-19'
MATCH (u)-[:USER_AVAILABILITY]-(a3:Availability)
WHERE a3.Date = '2018-07-20'
RETURN u

但是显然,它不起作用,因为我只能通过一条路径。你有什么想法吗?

2 个答案:

答案 0 :(得分:1)

只需这样做:

MATCH (u:User {id:'1'}),
      (u)-[:USER_AVAILABILITY]-(a:Availability),
      (u)-[:USER_AVAILABILITY]-(a2:Availability),
      (u)-[:USER_AVAILABILITY]-(a3:Availability)
WHERE a.Date = '2018-07-18' AND 
      a2.Date = '2018-07-19' AND 
      a3.Date = '2018-07-20'
RETURN u

答案 1 :(得分:1)

使用值列表时,可以使用all()来确保谓词对列表中的所有值均成立。假设您将日期列表作为参数传递(假设$requiredDates):

MATCH (u:User {id:$userId})
WHERE all(date in $requiredDates WHERE (u)-[:USER_AVAILABILITY]-(:Availability {Date:date}))
RETURN u