我觉得奇怪的是,使用没有预期关系的OPTIONAL MATCH节点不会作为路径中的单个节点返回。
OPTIONAL MATCH path = (:Person) -[:LIKES]- (:Movie)
UNWIND nodes(p) as n
UNWIND rels(p) as e
WITH n
WHERE HEAD(LABELS(n)) = “Person”
return COUNT(DISTINCT n)
退回的人数仅包括喜欢看电影的人。通过使用OPTIONAL我会期望所有人都被退回。 有没有解决方法,或者我在查询中做错了什么?
答案 0 :(得分:1)
更好的方法是匹配所有:人口节点,然后使用OPTIONAL MATCH匹配电影(或者,如果你想要他们喜欢的电影集合,请使用pattern comprehension )。
如果确实需要在空集合上执行UNWIND而不擦除行,请在某些条件下使用CASE来使用单元素列表而不是空列表。
MATCH (n:Person) // match all persons
OPTIONAL MATCH p = (n) -[:LIKES]- (m:Movie) // p and m are the optionals
UNWIND CASE WHEN p is null THEN [null] ELSE nodes(p) END as nodes // already have n, using a different variable
UNWIND CASE WHEN p is null THEN [null] ELSE rels(p) END as e // forcing a single element list means UNWIND won't wipe out the row
WITH n
WHERE HEAD(LABELS(n)) = “Person” // not really needed at all, and bad practice, you don't know the order of the labels on a node
return COUNT(DISTINCT n) // if this is really all you need, just keep the first match and the return of the query (without distinct), don't need anything else