【问题标题】:Create Relationship between Account Nodes based on Listings Nodes sharing same Phone Number根据共享相同电话号码的列表节点创建帐户节点之间的关系
【发布时间】:2018-09-14 07:54:36
【问题描述】:

我有 2 个帐户节点和几个列表节点,如下所示。 Match 语句导致显示 2 个帐户,并与与该帐户关联的每个列表都有关系。

我想要做的是基于至少 1 个共享相同电话号码的列表在两个帐户之间建立关系。

如果可能的话,我想查看绘制的两个帐户节点之间的关系以及两个列表之间的关系,只要列表来自不同的帐户。

MERGE (:Account {account_id:11})
MERGE (:Listing {account_id:11, listing_id:1001, phone:99468320, author:'Paul'})

MERGE (:Account {account_id:12})
MERGE (:Listing {account_id:12, listing_id:1002, phone:97412521, author:'Sam'})
MERGE (:Listing {account_id:12, listing_id:1003, phone:97412521, author:'Sam'})
MERGE (:Listing {account_id:12, listing_id:1004, phone:99468320, author:'Sam'})
MERGE (:Listing {account_id:12, listing_id:1004, phone:0, author:'Same'})


MATCH (a:Account),(l:Listing)
WHERE a.account_id = l.account_id
CREATE (a)-[:LISTING]->(l)
RETURN a,l;

对于后者,我确实尝试了以下方法,但它有点疯狂,因为它将具有相同编号的每个列表相互关联,只有在 account_id 不同时才这样做。

match (p1:Listing)
with p1
match (p2:Listing)
where p2.phone = p1.phone and p1 <> p2
merge(p1)-[r:SHARED_PHONE]-(p2)
RETURN p1, p2

【问题讨论】:

  • 你为什么不把p1 &lt;&gt; p2替换成p1.account_id &lt;&gt; p2.account_id呢?根据定义,如果帐户 id 不匹配,则它们不是同一个节点。 (或NOT p1.account_id = p2.account_id,如果您希望它更具可读性)另外,这将创建 2 个关系,每个方向一个。您确定不想将电话号码拆分到他们自己的节点以使您更轻松地跟踪 Cyphers 吗?

标签: neo4j cypher


【解决方案1】:

首先,您应该仔细考虑是否真的需要SHARED_PHONE 关系,因为每次添加、删除或更改电话号码时都必须更新关系。这可能会使您的许多查询复杂化,并使您的数据库不必要地变慢。此外,您最终可能会得到很多 SHARED_PHONE 关系(您可能并不真正需要)。您可以考虑将发现具有相同电话号码的节点合并到相关查询中,而不是创建关系。

但是,如果您决定确实需要这种关系,这里有一种方法可以满足您的需求:

[更新]

MATCH (n: Listing)
WITH n.phone AS phone, COLLECT(n) AS ns
FOREACH(i IN RANGE(0, SIZE(ns)-2) |
  FOREACH(x IN [ns[i]] |
    FOREACH(y IN [z IN ns[i+1..] WHERE x.account_id <> z.account_id] |
      MERGE (x)-[:SHARED_PHONE]-(y) 
    )))

WITH 子句收集共享相同phone 的所有(唯一)Listing 节点,嵌套的FOREACH 子句执行确保所有适当节点所需的最小数量的MERGEs通过SHARED_PHONE 关系(在任一方向)连接。最里面的FOREACH也保证了要连接的节点不会有相同的account_id。

【讨论】:

  • 数据创建后不会更改,此查询的目的是建立多个帐户使用,
  • 该查询似乎不起作用,因为它在同一帐户下的列表之间创建了关系,而我只希望两个帐户共享相同的电话号码。
  • 对于查找具有相同电话但不同 account_id 的列表对的任务来说,这似乎过于复杂...... FOREACH 的全部用途是什么?为什么要超过where p2.phone = p1.phone and p1.account_id &lt;&gt; p2.account_id?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多