neo4j - 找到关系密切的节点

时间:2015-10-26 01:11:51

标签: neo4j querying

我的图表中有地方和人物作为标签,以及关系" knows_the_place"。喜欢:

(person)-[knows_the_place]->(place) 

一个人通常知道多个地方。

现在我想找到一个拥有强大"通过地方(有很多"地点和#34;共同点)的关系,所以例如我想查询所有人,分享至少3个不同的地方,像这样(不工作!)查询:

MATCH
(a:person)-[:knows_the_place]->(x:place)<-[:knows_the_place]-(b:person),
(a:person)-[:knows_the_place]->(y:place)<-[:knows_the_place]-(b:person),
(a:person)-[:knows_the_place]->(z:place)<-[:knows_the_place]-(b:person)
WHERE NOT x=y and y=z
RETURN a, b

如何使用neo4j Query执行此操作?

加成-问题:

如果我能获得如下订单列表,而不是向我展示与另一个人有x个共同点的人,那就更好了。

与b共享7个名额 c与b共享5个名额 d与e共享2个名额 f分享1个名额 ...

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

你走了:

MATCH (a:person)-[:knows_the_place]->(x:place)<-[:knows_the_place]-(b:person)
WITH a, b, count(x) AS count
WHERE count >= 3
RETURN a, b, count

订购:

MATCH (a:person)-[:knows_the_place]->(x:place)<-[:knows_the_place]-(b:person)
RETURN a, b, count(x) AS count
ORDER BY count(x) DESC

您也可以通过在第一个查询中添加ORDER BY来完成这两项工作。

请注意,此查询是ab的笛卡尔积,因此它将检查person个节点的每个组合,如果您有这些节点可能效果不佳很多person个节点。 Neo4j 2.3应该警告你这些类型的查询。