相互之友Neo4j Cypher

时间:2014-07-23 16:46:26

标签: neo4j cypher

我是Neo4j和Cypher的新手,并在我的BA-Thesis上写作,在社交网络的情况下,我将RDBMS与Neo4j图形数据库进行比较。我在SQL和Cypher中定义了一些查询,以便在JMETER中通过JDBC和REST API进行性能测试。但是,我有一个问题,即声明Cypher查询获取节点,这些节点是某个节点的朋友的共同朋友。

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

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

3 个答案:

答案 0 :(得分:2)

我猜你的Cypher声明非常接近。我认为“第二学位的共同朋友”意味着我是一个共同的朋友,目标是共同的朋友?

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

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

答案 1 :(得分:1)

如果您可以在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节点

匹配

答案 2 :(得分:0)

一旦你与​​朋友匹配,你应该能够将其余的查询表达为路径谓词:匹配&#34;我的朋友&#34;,过滤除了&#34;我的那些人之外的所有人朋友有一些共同的朋友&#34;,和那些朋友的朋友是我的朋友的朋友相同。

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

这是一个控制台:http://console.neo4j.org/r/87n0j9。如果我误解了您的问题,您可以在该控制台中进行更改,请点击&#34;分享&#34;并在此处回复链接,并说明您希望获得的结果。

修改
如果您想让两个或更多朋友的节点共同相关,您可以

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

作为邻居公共邻居的节点可以描述为至少可以在两条路径上到达的节点。因此,您可以匹配您的邻居邻居,计算每个&#34;非&#34;是匹配的,如果匹配不止一次,那么它就是&#34;非&#34;这至少对你的两个邻居来说很常见。如果您愿意,您可以返回该计数并将结果作为一种评分来排序(因为这似乎是出于推荐目的)。

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