Создать связь между узлами учетной записи на основе списков узлов, имеющих один и тот же номер телефона - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть 2 узла аккаунта и несколько узлов листинга, как показано ниже. Оператор Match приводит к отображению двух учетных записей со связью с каждым списком, связанным с этой учетной записью.

То, что я хочу сделать, это создать отношения между двумя учетными записями, основываясь как минимум на одном из этих списков, каждый из которых имеет один и тот же номер телефона.

Если возможно, я хочу увидеть взаимосвязь между двумя нарисованными узлами счета и взаимосвязь между этими двумя списками, если они принадлежат другому аккаунту.

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

1 Ответ

0 голосов
/ 14 сентября 2018

Прежде всего, вы должны тщательно продумать, действительно ли вам нужны отношения 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 собирает все (уникальные) Listing узлы, которые совместно используют один и тот же phone, и вложенные FOREACHпункты выполняют минимальное количество MERGE с, необходимое для обеспечения того, чтобы все соответствующие узлы были связаны отношением SHARED_PHONE (в любом направлении).Внутренний FOREACH также гарантирует, что подключаемые узлы не имеют одинакового account_id.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...