【问题标题】:Cypher query using foreach使用 foreach 进行密码查询
【发布时间】:2018-01-30 18:37:07
【问题描述】:

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

User Pincodes
A [111,222]
B [111,333]
C [333,444]
D [111,222]

所以,我想在 A 和 B 之间创建关系,因为它们具有相同的密码以及 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)
);

【问题讨论】:

  • 女巫的数据密码类型是什么?整数列表?
  • 即:你有(:User {pincode : [111,222]})这样的节点吗?
  • 您是否考虑过以不同方式进行建模?使用唯一的 :Pincode 节点获取密码,以及与拥有它们的用户的关系?这使得寻找具有密码的用户变得微不足道。

标签: neo4j cypher


【解决方案1】:

编辑:

来自cmets:

我在我的问题中添加了一条新记录(请参见上文)。现在如果我 使用您的查询,它将在 A、B 和 D 之间创建关系。 A 和 D 之间还有另一个常见的密码,这是越来越 包含在以前的关系本身中。我们可以更新您的查询吗 这样就包括了两种不同的关系?

这个使用filterFOREACH 的查询应该可以工作:

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 列表中的节点对。

【讨论】:

  • 感谢您的解决方案。它工作绝对正确。但我只是想到了一个用例。我在我的问题中添加了一条新记录(请参见上文)。现在,如果我使用您的查询,它将在 A、B 和 D 之间创建一个关系。A 和 D 之间还有另一个常见的 pincode,它被包含在以前的关系本身中。我们可以更新您的查询以包含两种不同的关系吗?
  • 您好@user2720919,不客气。我已经更新了我的答案。看一看!谢谢!
  • Neo4j 'filter' 功能不再支持
【解决方案2】:

虽然@Bruno Peres 的解决方案有效,但遵循图表的精神,将区域作为单独的节点是合理的。例如:

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

【讨论】:

  • 谢谢。两种解决方案都有效。但是,我想就我的范围对您的解决方案发表评论。我想找出最重要的用户使用中介中心性。该算法由 Neo4j 提供。查询如下所示: CALL algo.betweenness.stream('User','liveInTheArea', {direction:'', write:true, writeProperty:'centrality'}) yield nodeId,centrality RETURN nodeId, centrality。
  • 根据您的解决方案,我们创建了两个不同的标签,我不认为该算法提供了提供两个不同标签的方法,您能想出一种方法来解决这个问题并获得最重要的用户?
猜你喜欢
  • 2012-08-07
  • 2015-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-13
  • 1970-01-01
相关资源
最近更新 更多