Neo4J Cypher:计算每个节点中有多少属性/属性与我的查询匹配

时间:2014-08-24 06:38:34

标签: neo4j cypher

例如,假设我的查询是:

  

匹配(你:用户)你在哪里:'洛杉矶'或者你。来自迈阿密'要么   u.Status:'单'或者你是:'艺术家'})回复你

如何更改查询,以便显示一个列,该列计算与查询匹配的属性数。

对于我上面的查询,假设我返回了以下用户:

> User1, Los Angeles, Miami, Single, Artist, (4 attributes matched query
> so show a 4 in column)
> 
> User2, Los Angeles, Miami, Married, Artist, (3 attributes matched
> query so display 3 in column)
> User3, Los Angeles, New York, Married, Dancer, (1 attributes matched
> query so display 1 in column)

我用它来构建一种排名系统

我试图得到这个:

u.UserID     u.MatchingAttributes

User1        4

User2        3

User3        1

如果您可以请展示如何通过关系来表达这一点,也可以作为奖励。感谢。

2 个答案:

答案 0 :(得分:2)

您可以使用一堆CASE语句:

MATCH (u:User)
WITH u.UserID AS User, CASE WHEN u.LivesIn = 'Los Angeles' THEN 1 ELSE 0 END AS c1,
                       CASE WHEN u.From = 'Miami' THEN 1 ELSE 0 END AS c2,
                       CASE WHEN u.Status = 'Single' THEN 1 ELSE 0 END AS c3,
                       CASE WHEN u.Job = 'Artist' THEN 1 ELSE 0 END AS c4
RETURN User, c1 + c2 + c3 + c4 AS Matching

答案 1 :(得分:1)

假设您将图形建模为

enter image description here

现在,您可以将关系命名为合适的关系。我粘贴的图模型的唯一目的是说明匹配策略,这就是为什么我跳过了适当地命名关系并添加节点标签的原因。

现在你可以做的是

match (u:User)-[r]-(m) where m.name in ['LA','Miami','Single','Artist'] return u,count(m) as count

{假设m个其他节点(用户标记的节点除外)上面有名称属性}