如果两个节点都连接到其他三个节点,则将它们连接在一起?

时间:2017-11-06 10:30:54

标签: neo4j cypher

我有一个包含两种类型节点的图表:人员节点和购买的产品,关系是购买。如果两个节点共享三个产品节点,我想将两个人节点链接在一起,即如果他们购买了三个相同的东西。这样做的最佳方法是什么?

该图表有几亿个节点。哪种方式也会最快?在密码中,我想的可能是下面这样的东西,但它花了很多年,似乎什么也没做?

MATCH path1 = (p1:PEOPLE)--(product:PRODUCT)--(p2:PEOPLE) 
WHERE p1.person_id <> p2.person_id
WITH path1,p1,p2
MATCH path2=(p1)--(:PRODUCT)--(p2) WHERE nodes(path2)<>nodes(path1)
WITH path1,path2,p1,p2
MATCH path3 = (p1)--(:PRODUCT)--(p2)
WHERE nodes(path3)<>nodes(path2) and nodes(path3)<>nodes(path1)
create (p1)-[:LINK]->(p2)
create (p2)-[:LINK]->(p1)

任何建议都非常感谢!

1 个答案:

答案 0 :(得分:0)

使用count aggregating function检查两个节点之间的常见产品数量,而不是使用多个MATCH子句。

MATCH (p1:PEOPLE)--(product:PRODUCT)--(p2:PEOPLE) 
WITH p1, p2, count(product) AS commonProductCount
WHERE commonProductCount >= 3
CREATE (p1)-[:LINK]->(p2)
CREATE (p2)-[:LINK]->(p1)

注意。根据经验,没有必要在相反方向创建两个LINK关系。您应该选择一个方向并创建关系,并在查询中使用()-[:LINK]-()等无向关联。