Neo4j 使用foreach的密码查询

Neo4j 使用foreach的密码查询,neo4j,cypher,Neo4j,Cypher,我试图在具有相同pincode的用户之间建立关系。我的数据如下所示: User Pincodes A [111,222] B [111,333] C [333,444] D [111,222] 所以,我想在A和B之间建立关系,因为它们有相同的pincode,B和C之间有另一种关系。我写了下面这样的东西,这绝对不是我想要的 MATCH (a:User),(b:User) WHERE a.pincode=b.pincode WITH COLLECT([a,b]) AS its FOREACH (p

我试图在具有相同pincode的用户之间建立关系。我的数据如下所示:

User Pincodes
A [111,222]
B [111,333]
C [333,444]
D [111,222]
所以,我想在A和B之间建立关系,因为它们有相同的pincode,B和C之间有另一种关系。我写了下面这样的东西,这绝对不是我想要的

MATCH (a:User),(b:User)
WHERE a.pincode=b.pincode
WITH COLLECT([a,b]) AS its
FOREACH (pincode IN its |
    CREATE (a)-[r:LIVESINSAMEAREAAS]->(b)
);
编辑:

从评论中:

我在问题中增加了一项新记录(请参见上文)。现在如果我 使用您的查询,它将在a、B和D之间创建关系。 在A和D之间有另一个共同的pincode,这是 包括在以前的关系中。我们可以更新您的查询吗 这样就包括了两种不同的关系

此查询使用和应该可以工作:

MATCH (a:User),(b:User)
WHERE id(a) > id(b)
WITH a, b, filter(ap in a.pincodes where ap in b.pincodes) as pincodes
FOREACH (pc in pincodes | CREATE (a)-[:LIVESINSAMEAREAAS]->(b))

原始答案:

我假设
pincode
是一个整数列表。因此,我根据您的问题创建了此示例数据:

create (:User {pincodes : [111,222]}) 
create (:User {pincodes : [111,333]}) 
create (:User {pincodes : [333,444]})
我编写了一个查询,以获取至少有一个公共节点的所有节点
pincode
。然后在这些节点之间创建一个关系
:LIVESINSAMEAREAAS

MATCH (a:User),(b:User)
WHERE id(a) > id(b) AND ANY (ap in a.pincodes WHERE ap IN b.pincodes)
CREATE (a)-[r:LIVESINSAMEAREAAS]->(b)
WHERE(
id(a)>id(b)
)中的第一个条件用于避免笛卡尔积和在两个方向上创建关系。即:(a)-->(b)及(b)-->(a)


在第二种情况下,我正在筛选一对节点,其中
a
的至少一个pincode包含在
b
的pincode列表中

虽然解决方案是可行的,但遵循图形的精神,将该区域作为一个单独的节点是合理的。例如:

MATCH (U:User) UNWIND U.pincodes as pincode
MERGE (A:Area {pincode: pincode})
MERGE (U)-[:liveInTheArea]->(A)
RETURN *

数据pincode的类型是什么?整数列表?也就是说:你有没有像
(:User{pincode:[111222]})
这样的节点?你有没有考虑过以不同的方式建模?使用unique:Pincode节点作为Pincode,以及与拥有它们的用户的关系?这使得在公共区域查找具有pincode的用户变得微不足道。感谢您的解决方案。它工作完全正确。但我只想到了一个用例。我在问题中增加了一项新记录(请参见上文)。现在,如果我使用您的查询,它将在a、B和D之间创建一个关系。a和D之间有另一个公共pincode,这将包含在前面的关系中。我们是否可以更新您的查询,以便包含两种不同的关系?您好@user2720919,欢迎您。我已经更新了我的答案。看一看!谢谢非常感谢。这两种解决方案都有效。但是,我想就我的范围对您的解决方案发表意见。我想利用中间性中心性找出最重要的用户。该算法由Neo4j提供。查询看起来像:CALL algo.betweenness.stream('User','liveInTheArea',{direction:'',write:true,writeProperty:'centrality'})yield nodeId,centrality RETURN nodeId,centrality。根据您的解决方案,我们创建了两个不同的标签,我不认为算法提供了给两个不同标签的方法,你能想出一个办法来解决这个问题并获得最重要的用户吗?