Neo4j 将多个匹配项中的节点合并到单个变量中

Neo4j 将多个匹配项中的节点合并到单个变量中,neo4j,cypher,Neo4j,Cypher,使用neo4j社区版2.x。在Cypher中,我需要以(两)种不同的方式匹配节点,然后将这(两)组匹配的节点组合成单个集合(一个变量名)。然后将使用此集合进行进一步操作 (我不能发布图片) 我想找到关于松鼠的所有知识,包括她所属团体所共享的知识。(例子是虚构的) 我想象这样的情况: MATCH (u:User{username:'squirrel'}), (:User{username:'squirrel'})<-[:MEMBER]-(g:Group) WITH "COMBINATION

使用neo4j社区版2.x。在Cypher中,我需要以(两)种不同的方式匹配节点,然后将这(两)组匹配的节点组合成单个集合(一个变量名)。然后将使用此集合进行进一步操作

(我不能发布图片)

我想找到关于松鼠的所有知识,包括她所属团体所共享的知识。(例子是虚构的)

我想象这样的情况:

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
MATCH(u:User{username:'squirrel'}),(:User{username:'squirrel'})(k:Knowledge)
返回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
MATCH(u:User{username:'squirrel})->(k:Knowledge)
返回k.type
联合
匹配(u:User{username:'squirrel'})(k:Knowledge)
返回k.type
这可能解决了这个简单的示例,但不适合更复杂的查询。我为更一般的问题寻找解决方案:匹配多组节点,将它们粘合到单个集合(单个变量)中,然后继续使用这个新集合

有什么想法吗?我缺少一些基本的东西吗?或者这是不可能的?谢谢

可能是类似的东西

编辑:

通过从节点集合中提取内部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
MATCH(u:User{username:'squirrel'}),(:User{username:'squirrel'})(k:Knowledge)
返回k.type

是否可以做得更好?

不确定一般情况,但对于这种特定情况,您可以尝试将两种模式组合为一种,如下所示:

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

到目前为止,我找到的唯一通用解决方案是:

  • 匹配所需的起点(使用不同的名称)
  • 收集起点的内部ID
  • 将起始点与收集的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
MATCH(u:User{username:'squirrel'}),(:User{username:'squirrel'})(k:Knowledge)
返回k.type

至少从Neo4j 3.0开始,您可以使用可变长度模式匹配来解决此问题。只需将最小长度显式设置为0,并将标签测试移动到单独的WHERE子句:

MATCH (:User {username:'squirrel'}) <-[:MEMBER*0..1]- (ug)
WHERE ug:User OR ug:Group
WITH ug
MATCH (ug)-[:KNOW_HOW]->(k:Knowledge)
RETURN k.type
MATCH(:User{username:'squirrel'})(k:Knowledge)
返回k.type