如何使用cypher返回一些有限数量的节点,以及所有节点的数量?

时间:2014-05-01 20:06:05

标签: neo4j cypher

我目前有这个查询:

START n=node(*) 
MATCH (p:Person)-[:is_member]->(g:Group) 
WHERE g.name ='FooManGroup' 
RETURN p, count(p)
LIMIT 5

假设FooManGroup中有42个人,我想返回其中5个人,计数为42个。

这可以在一个查询中完成吗?

现在运行它会返回5行,这很好,但计数为104,这是我的数据库中任何类型的节点总数。

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

您可以使用WITH子句对人员进行计数,然后使用相同的MATCH子句对每个人进行匹配。请注意,您需要在START个节点上p,而不仅仅是与图中任何节点匹配的n {/ p>}

MATCH (p:Person )-[:is_member]->(g:Group)
WHERE g.name ='FooManGroup' 
WITH count(p) as personsInGroup
MATCH (p:Person)-[:is_member]->(g:Group)
WHERE g.name ='FooManGroup'
RETURN p, personsInGroup
LIMIT 5

它可能不是最佳或最优雅的方式,但它有效。如果您使用cypher 2.0,它可能会更紧凑:

MATCH (p:Person)-[:is_member]->(g:Group {name: 'FooManGroup'})
WITH count(p) as personsInGroup
MATCH (p:Person)-[:is_member]->(g:Group {name: 'FooManGroup'})
RETURN p, personsInGroup
LIMIT 5

关系类型在cypher中总是大写的,因此:is_member应该是:IS_MEMBER,我认为它更具可读性:

MATCH (p:Person)-[:IS_MEMBER]->(g:Group {name: 'FooManGroup'})
WITH count(p) as personsInGroup
MATCH (p:Person)-[:IS_MEMBER]->(g:Group {name: 'FooManGroup'})
RETURN p, personsInGroup
LIMIT 5

答案 1 :(得分:0)

试试这个:

MATCH (p:Person)-[:is_member]->(g:Group) 
WHERE g.name ='FooManGroup' 
RETURN count(p), collect(p)[0..5]