【问题标题】:Mutual Friends of Friends Neo4j Cypher朋友的共同朋友 Neo4j Cypher
【发布时间】:2014-07-23 16:46:25
【问题描述】:

我是 Neo4j 和 Cypher 的新手,我正在撰写我的 BA 论文,其中我比较了社交网络中的 RDBMS 和 Neo4j 图形数据库。我已经在 SQL 和 Cypher 中定义了一些查询,用于在 JMETER 中通过 JDBC 和 REST API 进行性能测试。但是,我在声明 Cypher 查询以获取节点时遇到问题,这些节点是某个节点的朋友的共同朋友。

我的第一个方法是这样的:

MATCH (me:Enthusiast {Id: 488})-[:abonniert]->(f:Enthusiast)-[:abonniert]->(fof:Enthusiast)<-[:abonniert]-(f) RETURN o

【问题讨论】:

  • 能否详细说明您的问题?现在,很难说出你在问什么。
  • 如果一个节点 XY 有两个或更多的朋友(部分)有共同的朋友,那么我想返回这些信息。所以我不想在一级而是在二级上搜索共同的朋友。希望你能理解

标签: neo4j cypher


【解决方案1】:

我猜你的 Cypher 声明非常接近。我假设“二度共同朋友”意味着我与目标也是共同朋友的人是共同朋友?

如果是这样(缩短标签和关系类型以提高可读性):

MATCH 
(me:En {Id: 488})-[:abonniert]->(f:En)-[:abonniert]->(fof:En),
(fof)-[:abonniert]->(f)-[:abonniert]->me
RETURN fof

【讨论】:

  • 嘿,感谢您的努力,但我认为您理解我的错误。假设我是 id 为 488 的节点。我想知道我的哪些朋友有共同的朋友。
【解决方案2】:

如果您可以在 http://console.neo4j.org/ 创建一个示例场景,那就太好了。 我也会省略关系方向。

MATCH (me:Enthusiast {Id: 488})-[:abonniert]->(f:Enthusiast),
(f)-[:abonniert]-(x:Enthusiast)-[:aboniert]-(y:Enthusiast)
WHERE f--y AND Id(y) <> 488
RETURN f, y, count(x) as NrMutFr

编辑

试试这个控制台查询,适用于以下场景:http://console.neo4j.org/r/tws07k

在这种情况下,我的上述查询将是

MATCH (me:Enthusiast {Id: 488})-[:abonniert]->(f:Enthusiast),
(f)-[:abonniert]->(x:Enthusiast)<-[:aboniert]-(y:Enthusiast)
WHERE me--y 
RETURN f, y, count(x) as NrMutFr

您发布的问题查询之间的区别在于,您必须使用新的替代品 y 而不是 f 来完成最后一个节点。还有,如有必要,再次将 y 与起始 me 节点匹配

【讨论】:

  • 嘿,你是console.neo4j.org/r/pl3m0g ...目标是为节点 488 生成潜在订阅建议。在这种情况下,返回值必须是 ID 为 210 的节点。 ..我认为关系的方向很重要,因为它不是友谊..
【解决方案3】:

一旦你匹配了你的朋友,你应该能够将查询的其余部分表示为路径谓词:匹配“我的朋友”,过滤掉除“我的朋友中有一些共同朋友的那些人”之外的所有人,这相当于“那些我的朋友有一个朋友的朋友是我的朋友。

MATCH (me:Enthusiast { Id: 488 })-[:abonniert]->(f)
WHERE f-[:abonniert]-()-[:abonniert]-()<-[:abonniert]-me
RETURN f

这是一个控制台:http://console.neo4j.org/r/87n0j9。如果我误解了您的问题,您可以在该控制台中进行更改,单击“共享”并在此处发回链接,并说明您希望获得什么结果。

编辑
如果你想得到两个或多个好友有共同关系的节点,你可以这样做

MATCH (me:Enthusiast { Id: 488 })-[:subscribed]->(f)-[:subscribed]->(common) 
WITH common, count(common) AS cnt 
WHERE cnt > 1 
RETURN common

作为邻居的公共邻居的节点可以描述为您可以在至少两条路径上到达的节点。因此,您可以匹配您的邻居,计算每个“非”匹配的次数,如果匹配不止一次,则它是至少两个邻居共有的“非”。如果您愿意,您可以返回该计数并按其排序结果作为一种评分(因为这似乎是出于推荐目的)。

MATCH (me:Enthusiast { Id: 488 })-[:subscribed]->(f)-[:subscribed]->(common) 
WITH common, count(common) AS score 
WHERE score > 1 
RETURN common, score
ORDER BY score DESC

【讨论】:

  • 我已经在@ulkas 答案下方发表了评论.. 看看那个控制台 console.neo4j.org/r/pl3m0g .. 我想获得节点 210,因为它是 my(node 488) 的常见订阅) 订阅还不是我的订阅.. thx
  • 嗯,“知道我的哪些朋友有共同的朋友”与知道那些共同的朋友不同。我会在我的答案中添加如何做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-21
  • 2016-02-01
  • 1970-01-01
  • 2011-08-10
  • 1970-01-01
相关资源
最近更新 更多