2014-03-07 58 views
1

使用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 

能不能做到更好吗?

回答

1

唯一的通用的解决方案,我发现迄今:

  • 匹配所需的起始点(以不同的名称)
  • 收集内部的id开始点的
  • 匹配的开始点与收集的IDS(无W上的出发点有单名)
  • 你需要,起点做

现在的代码本身的任何行动:

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 
1

不知道的一般情况,但对于这种特殊情况下,你可以尝试在两种模式如下合并成一个,

MATCH (u:User{username:'squirrel'})<-[:MEMBER*0..1]-()-[:KNOW_HOW]->(k:Knowledge) 
RETURN k.type