【发布时间】:2014-03-07 00:23:55
【问题描述】:
使用 neo4j 社区版 2.x。在 Cypher 中,我需要以(两种)不同的方式匹配节点,然后将这(两组)匹配节点组合成一个集合(一个变量名)。该集合随后将用于进一步的操作。
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
可以做得更好吗?
【问题讨论】: