Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j 可选匹配不返回断开连接节点的路径_Neo4j_Cypher - Fatal编程技术网

Neo4j 可选匹配不返回断开连接节点的路径

Neo4j 可选匹配不返回断开连接节点的路径,neo4j,cypher,Neo4j,Cypher,我发现奇怪的是,使用不具有预期关系的可选匹配节点不会作为路径中的单个节点返回 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,我希望所有人都能返回。 是否有一个

我发现奇怪的是,使用不具有预期关系的可选匹配节点不会作为路径中的单个节点返回

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,我希望所有人都能返回。
是否有一个解决方法,或者我在查询中做了一些错误的事情?

更好的方法是首先匹配所有:人员节点,然后使用可选的匹配来匹配电影(或者,如果您想要他们喜欢的电影集,请使用)

如果确实需要在不清除行的情况下对空集合执行展开,请在某些条件下使用案例,以使用单个元素列表而不是空列表

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

我应该补充一点,这个问题是由于UNWIND rels()UNWIND产生行,如果UNWIND没有产生行,那么它就不会走得更远。太棒了!我从来没有想过使用这个案例,现在它看起来如此明显。事实上,我需要使用“展开”与其他节点一起返回起始节点。因为p不能为null,除非图中没有人,所以我使用“展开”大小写更改了your proposal,当长度(p)=0时,[null]否则关系(p)结束为e。我对
p
的放置与您的不同。在我们已经匹配到
n
之后,它位于可选匹配上,因此当某人不喜欢电影时,它可以为空。这是因为您在可选匹配之前以匹配(n:person)开头吗?是的。这确保
n
将匹配所有:个人节点。可选匹配不会改变这一点,但如果图中没有与该模式匹配的变量,则该可选匹配(
p
m
)中新引入的变量将为空。