Neo4J Cypher排除反向路径

时间:2015-03-22 19:17:18

标签: neo4j

我有一个简单的图表,其中节点连接到其他节点,例如

人 - [Shops_At] - >店

我想找到每个商店的客户数量,我可以通过匹配来做到这一点
Shop< - [Shops_At] - 人物 - [Shops_At] - >店
并计算Person节点的数量。 我可以排除商店相同的情况。

在Cypher中如何停止获取路径的两个方向。 例如(带id)

194< - [Shops_At] - 18 - [Shops_At] - > 200
200< - [Shops_At] - 18 - [Shops_At] - > 194

我只希望每条路径一次。

更新: 所以我想要进行上述查询但只得到每条路径一次的原因是我最终想要生成一个图形,其中商店通过具有共享客户数量权重的边连接在一起。

所以对于上述情况。

200 - [股客户,18] - 194

我不想要新图表中的反向路径。

2 个答案:

答案 0 :(得分:3)

我已经确定了一种做我想做的事情的方法。
在密码查询中,我可以坚持一个商店的ID比另一个小

match(n:`shop`) - (p:`person`) - (m:`shop`)WHERE id(n)< id(m)返回n,count(p),m

答案 1 :(得分:2)

您可以使用更简单的解决方案来完成此任务:

首先匹配商店,你不会重复并计算他们拥有的客户:

MATCH (shop:Shop)
MATCH (shop)<-[:Shops_At]-(customer)
RETURN shop, count(*)

编辑:

以下是一个查询,它会将您的商店和共享客户的数量返回到以下形式的其他商店:

s       otherShop  weight
animi   libero  10
animi   modi    9
animi   ut  9
animi   nesciunt    8
animi   libero  6
aut tempore 14
aut animi   17
aut in  15
aut ut  11
aut quo 14


MATCH (s:Shop)
MATCH (s)<-[:SHOPS_AT]-(c)
MATCH (otherShop)<-[:SHOPS_AT]-(c)
WHERE otherShop <> s
WITH s, otherShop, count(distinct(c)) as sharedCustomers
RETURN s, otherShop, sharedCustomers as weight
ORDER BY s.name

您可以在以下Neo4j控制台中测试此查询:http://console.neo4j.org/?id=phsywr

根据此查询,您可以轻松地对其进行调整(在测试结果是您所期望的之后)在商店之间创建关系:

MATCH (s:Shop)
MATCH (s)<-[:SHOPS_AT]-(c)
MATCH (otherShop)<-[:SHOPS_AT]-(c)
WHERE otherShop <> s
WITH s, otherShop, count(distinct(c)) as sharedCustomers
MERGE (s)-[:CROSS_SHOP {weight: sharedCustomers}]->(otherShop)