使用neo4j社区版本2.x.在Cypher中,我需要以两种不同的方式来匹配MATCH节点,然后将这些(两个)匹配节点集合成单个集合(一个变量名称)。这一套将用于进一步的行动。将来自更多MATCH的节点组合成单个变量
naive graph example(我不能发表图片)
我想找到松鼠的所有知识,包括由组她的成员共享知识。 (例子是虚构的)
我想是这样的:
MATCH (u:User{username:'squirrel'}), (:User{username:'squirrel'})<-[:MEMBER]-(g:Group)
WITH "COMBINATION OF u AND g" AS ug
MATCH (ug)-[:KNOW_HOW]->(k:Knowledge)
RETURN k.type
成果既要“破解坚果”和“逃避天敌”。
代替“u与g的组合”,我尝试了collect(u)+ collect(g),EXTRACT等的变体。没有成功。
到目前为止,我发现最简单的工作方式是使用UNION。
MATCH (u:User{username:'squirrel'})-[:KNOW_HOW]->(k:Knowledge)
RETURN k.type
UNION
MATCH (u:User{username:'squirrel'})<-[:MEMBER]-(:Group)-[:KNOW_HOW]->(k:Knowledge)
RETURN k.type
这可能会解决这个简单的例子,但不适合更复杂的查询。我寻求解决更一般问题的方法:匹配几组节点,将它们粘合成单个集合(单个变量)并继续使用这个新集合。
有什么想法吗?我缺少一些基本的东西吗?或者这是不可能的?谢谢!
在grokbase上可能类似的东西。
编辑:
随着this hacky solution to similar question我是能够解决由节点的集合提取内部ID的问题:
MATCH (u:User{username:'squirrel'}), (:User{username:'squirrel'})<-[:MEMBER]-(g:Group)
WITH [x in collect(u)+collect(g)|id(x)] as collectedIds MATCH (ug) WHERE id(ug) in collectedIds
MATCH (ug)-[:KNOW_HOW]->(k:Knowledge)
RETURN k.type
能不能做到更好吗?