【问题标题】:Neo4J Cypher: Count How Many Attributes/Properties in each node matched my queryNeo4J Cypher:计算每个节点中有多少属性/属性与我的查询匹配
【发布时间】:2014-08-24 06:38:34
【问题描述】:

例如,假设我的查询是:

match (u:User) Where u.LivesIn:'Los Angeles' OR u.From:'Miami' OR u.Status:'Single' OR u.Job:'Artist'}) 返回 u

我将如何更改我的查询,以便我可以显示一个列来计算有多少属性与我的查询匹配。

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

> 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 个节点,纽约/LA 可以是 2 个其他节点。都是由关系联系起来的。然后你可以轻松地做你想做的事..
  • 是的,这听起来更好,但我不确定如何使用 OR 与您提到的关系编写相同的查询。但是如果我确实使用关系,我将如何计算匹配的属性?
  • 您可以创建单独的节点,而不是将其作为节点属性保存,这些节点将被用户节点喜欢。检查我的解决方案以获得更清晰的理解。

标签: neo4j cypher


【解决方案1】:

你可以使用一堆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

【讨论】:

  • 这是一个非常聪明的方法!不错!!
  • 这是我最终使用的,还将它与合并(对于真/假)和减少相结合以求和。谢谢。
【解决方案2】:

假设你的图被建模为

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

现在你可以做的是

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

{假设m之上的其他节点(除了用户标记的节点)在其中有名称属性}

【讨论】:

  • 感谢图表和回复。我最终使用了 Nicole 的解决方案,但正如你提到的,我会更多地使用 neo4j 关系。
  • 我还建议您阅读有关 neo4j 用于存储属性的底层数据结构以及如何优化数据检索的信息......因为这样您就会明白我为什么建议使用关系......跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多