Cypher匹配节点与给定类型的X关系较少

时间:2014-01-02 09:39:26

标签: neo4j cypher

鉴于这些数据,我想密码查询neo4j数据库,查找那些X是他们自己的friend_limit属性的X朋友少的用户。我尝试过多次COUNT次查询,但未能获得一致的结果。

例如,在这种情况下,我希望收到除Joe以外的所有用户的结果集(2个朋友中的2个)和Ella(1个中的1个)。

CREATE 
(Joe:User { name:'Joe', friend_limit:2 }),
(James:User {name: 'James', friend_limit:2}),
(Jack:User {name: 'Jack', friend_limit:2}),
(Jane:User {name: 'Jane', friend_limit:2}),
(Ella:User {name: 'Ella', friend_limit:1}),
(Ann:User {name: 'Ann', friend_limit:2}),

(Joe)-[:FRIENDS_WITH]->(Ella),
(Joe)-[:FRIENDS_WITH]->(James),
(James)-[:FRIENDS_WITH]->(Jack),
(Ella)-[:FRIENDS_WITH]->(Jane)

http://console.neo4j.org/r/gbnw5s


编辑:我已经到了这个但是我找不到在结果集中包含Ann的方法,她可能因为没有任何FRIENDS_WITH关系而失踪,因此失败{ {1}}部分?

MATCH

http://console.neo4j.org/r/vjy1lt

2 个答案:

答案 0 :(得分:3)

MATCH (u:User) 
WITH u 
OPTIONAL MATCH (u:User)-[:FRIENDS_WITH]-(f:User) 
WITH u, count(f) AS friendCount 
WHERE friendCount < u.friend_limit 
RETURN u, friendCount

有效(使用可选匹配来获得Ann)。虽然我必须首先使用

进行匹配
MATCH (u:User) 
WITH u 

不确定是否有更好的方法

答案 1 :(得分:1)

我会以类似于@Luanne的方式来做,只是更简洁一点:

MATCH (u:User) 
OPTIONAL MATCH (u)-[:FRIENDS_WITH]-(f:User) 
WITH u, count(f) AS friendCount 
WHERE friendCount < u.friend_limit 
RETURN u, friendCount

我已经离开了f:User,因为我认为这会让它更有效率,特别是如果模型在以后更改,以便用户可以成为除用户之外的其他东西的朋友(但可能会有不管怎样,不同的关系类型。)