Как выполнить поиск «ИЛИ» в шифре NEO4J? - PullRequest
0 голосов
/ 11 июня 2018

У меня есть база данных Neo4j с разными метками на узлах, таких как: Banker, b: Customer.у каждого есть свойство электронной почты, которое я хочу найти по электронной почте, но не ищу всю базу данных.Поэтому я хочу сделать что-то вроде этого соответствия (a: Banker {email: '123@mymail.com'}) ИЛИ Match (b: Customer {email: '123@mymail.com '}).Для обоих ярлыков существуют ограничения по электронной почте, но я не хочу, чтобы у каждого ярлыка был один и тот же адрес электронной почты, поэтому перед тем, как добавить узел, мне нужно определить, существует ли письмо в узлах Banker или Customer.Я подозреваю, что это может быть сделано очень эффективным масштабируемым способом, который не заставит пользователя пялиться на счетчик при попытке добавить миллионную запись ..... любая помощь будет высоко ценится

Ответы [ 2 ]

0 голосов
/ 12 июня 2018
  1. Несколько более безопасный подход, чем у @ Liam, заключается в том, чтобы просто иметь метку Person без меток Banker и Customer.Таким образом, было бы сложнее случайно создать / объединить узел без метки Person, поскольку это была бы единственная метка для человека.Кроме того, этот подход не требует 2 (или 3) проверок уникальности каждый раз, когда вы добавляете человека.

    При таком подходе вы также можете добавлять логические свойства isCustomer и isBanker, по мере необходимости, и создаватьиндексы :Person(isCustomer) и :Person(isBanker) для быстрого поиска клиентов по сравнению с банкирами.

  2. Теперь, сказав выше, мне интересно, действительно ли вам нужны свойства isCustomer и isBanker(или метки Customer и Banker) вообще.То есть тот факт, что узел Person является банкиром и / или клиентом, может быть получен из отношений этого узла.Кажется разумным, чтобы ваша модель данных содержала Bank узлов с отношениями между ними и людьми.Например, в следующей модели данных b - это банкир в «XYZ Bank», c - это клиент, а bc - это оба:

    (b:Person)-[:WORKS_AT]->(xyz:Bank {id:123, name: 'XYZ Bank'}),
    (c:Person)-[:BANKS_AT]->(xyz),
    (bc:Person)-[:BANKS_AT]->(xyz)<-[:WORKS_AT]-(bc)
    

    Этот запрос найдет всех банкиров:

    MATCH (banker:Person)-[:WORKS_AT]->(:Bank)
    RETURN banker;
    

    Это найдет всех клиентов:

    MATCH (banker:Person)-[:BANKS_AT]->(:Bank)
    RETURN banker;
    

    Это найдет всех банкиров, которые также являются клиентами в одном банке:

    MATCH (both:Person)-[:WORKS_AT]->(:Bank)<-[:BANKS_AT]-(both)
    RETURN both;
    
0 голосов
/ 11 июня 2018

Как бы я это сделал, добавьте ярлык «Персона» на всех Банкиров и Клиентов.

CREATE CONSTRAINT ON (b:Person) ASSERT p.Email IS UNIQUE
CREATE CONSTRAINT ON (b:Banker) ASSERT p.Email IS UNIQUE
CREATE CONSTRAINT ON (b:Customer) ASSERT p.Email IS UNIQUE

CREATE (b:Person:Banker {Email: "123@mymail.com"})
CREATE (b:Person:Customer {Email: "321@mymail.com"})
CREATE (c:Person:Customer {Email: "123@mymail.com"})

Последний не удастся, так как Персона / Банкир уже имеет тот же адрес электронной почты.Затем вы также можете выполнить поиск в MATCH (p: Person {Email: "123@mymail.com"}) или даже b: Banker, c: Customer

Вы также можете сделать (p: Person: Customer: Banker)если человек всех трех.

Это также позволит вам сделать MERGE , которая создает запись, если она еще не существует.

Поскольку у вас уже естьБаза данных, которую вы можете сделать:

MATCH(b:Banker)
SET b:Person

MATCH(c:Customer)
SET c:Person
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...