的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
你收集Bob
和Anna
和group 2
你收集Carla
。
很好的解释! – schabluk