的Neo4j从收集功能缺失节点

问题描述:

请考虑下面的例子:有三组和四个人:的Neo4j从收集功能缺失节点

CREATE (group1:Group { 
    name: 'Group 1' 
}) 
CREATE (group2:Group { 
    name: 'Group 2' 
}) 
CREATE (group3:Group { 
    name: 'Group 3' 
}) 
CREATE (personA:Person {name: 'Anna'}) 
CREATE (personB:Person {name: 'Bob'}) 
CREATE (personC:Person {name: 'Carla'}) 
CREATE (personD:Person {name: 'Denis'}) 
CREATE 
    (personA)-[:IS_PART_OF]->(group1), 
    (personB)-[:IS_PART_OF]->(group1), 
    (personB)-[:IS_PART_OF]->(group2), 
    (personC)-[:IS_PART_OF]->(group2), 
    (personC)-[:IS_PART_OF]->(group3), 
    (personD)-[:IS_PART_OF]->(group3) 

安娜和Bob属于组1,Bob和卡拉是第2组和Carla和丹尼斯的成员在3组 一个简单的暗号查询将显示此关系:

MATCH (g:Group)<-[:IS_PART_OF]-(m:Person) 
RETURN g, collect(DISTINCT m) 

+-------------------------------------------------------------------------+ 
| g      | collect(DISTINCT m)       | 
+-------------------------------------------------------------------------+ 
| Node[2]{name:"Group 3"} | [Node[6]{name:"Denis"},Node[5]{name:"Carla"}] | 
| Node[1]{name:"Group 2"} | [Node[5]{name:"Carla"},Node[4]{name:"Bob"}] | 
| Node[0]{name:"Group 1"} | [Node[4]{name:"Bob"},Node[3]{name:"Anna"}] | 
+-------------------------------------------------------------------------+ 
3 rows 

现在,我要展现给其安娜和Bob属于的,以及所有在这些组成员的所有组,包括安娜一个鲍勃。

我的查询是以下几点:

MATCH (p:Person)-[:IS_PART_OF]->(g:Group)<-[:IS_PART_OF]-(m:Person) 
WHERE p.name IN ['Anna', 'Bob'] 
RETURN g, collect(DISTINCT m) 

+----------------------------------------------------------------------+ 
| g      | collect(DISTINCT m)      | 
+----------------------------------------------------------------------+ 
| Node[1]{name:"Group 2"} | [Node[5]{name:"Carla"}]     | 
| Node[0]{name:"Group 1"} | [Node[4]{name:"Bob"},Node[3]{name:"Anna"}] | 
+----------------------------------------------------------------------+ 
2 rows 

结果是不是我所期待得到的。

为什么Bob没有显示,作为第2组的成员?

如果模式的关系与左侧和右侧相匹配,则模式左侧的节点将不会在右侧重复。

尝试此查询:

// Find group 
MATCH (p:Person)-[:IS_PART_OF]->(g:Group) WHERE p.name IN ['Anna', 'Bob'] 
// Get all person from group 
WITH g 
    MATCH (g)<-[:IS_PART_OF]-(m:Person) 
RETURN g, COLLECT(distinct m) 

为了更好地理解看到这个查询的结果:

MATCH (p:Person)-[:IS_PART_OF]->(g:Group)<-[:IS_PART_OF]-(m:Person) 
WHERE p.name IN ['Anna', 'Bob'] 
RETURN g, p, m 

╒═══════════════╤════════════╤═════════════╕ 
│g    │p   │m   │ 
╞═══════════════╪════════════╪═════════════╡ 
│{name: Group 1}│{name: Anna}│{name: Bob} │ 
├───────────────┼────────────┼─────────────┤ 
│{name: Group 2}│{name: Bob} │{name: Carla}│ 
├───────────────┼────────────┼─────────────┤ 
│{name: Group 1}│{name: Bob} │{name: Anna} │ 
└───────────────┴────────────┴─────────────┘ 

当您申请g, collect(distinct m)group 1你收集BobAnnagroup 2你收集Carla

+0

很好的解释! – schabluk