Шаблон Cypher для получения собственных связанных узлов - PullRequest
2 голосов
/ 15 апреля 2020

Учитывая, что я очень новичок в Neo4j. У меня есть схема, которая выглядит следующим образом: enter image description here

Здесь Has узлы отличаются, например Passport, Merchant, Driving License, etc., а также эти узлы описывают клиентский узел (ищет будущую область фильтрации клиентов на основе этих узлов) .

SIMILAR - это самоотношение, означающее, что существует клиент с ID:1, связанный с другим клиентом с ID:2 с оценка 2800.

У меня есть следующие вопросы:

  1. Является ли это хорошей схемой с учетом условия будущей области, о которой я упоминал выше, или получения всех свойств в жизнеспособен ли один клиентский узел? (Различные узлы также могут иметь массив элементов, например: ()-[:HAS]->(Phone) с {active: "+91-1231241", historic_phone_numbers: ["+91-121213", "+91-1231421"]})
  2. Я хочу познакомить клиента с описанием узлов по отношению к другим клиентам. Для этого я попробовал следующий запрос (без числа отношений больше 1):
// With number_of_relation > 1
MATCH (searched:Customer)-[r:SIMILAR]->(matched:Customer)
WHERE r.score > 2700
WITH searched, COLLECT(matched.customer_id) AS MatchedList, count(r) as cnt
WHERE cnt > 1
UNWIND MatchedList AS matchedCustomer
MATCH (person:Customer {customer_id: matchedCustomer})-[:HAS|:LIVES_IN|:IS_EMPLOYED_BY]->(related)
RETURN searched, person, related

Результат, который я получил ниже, обратите внимание, что один клиентский узел не имеет своих описывающих узлов:

enter image description here

// without number_of_relation > 1
// second attempt - for a sample customer_id
MATCH (matched)<-[r:SIMILAR]-(c)-[:HAS|:LIVES_IN|:IS_EMPLOYED_BY]->(b)
WHERE size(keys(b)) > 0
AND c.customer_id = "1b093559-a39b-4f95-889b-a215cac698dc"
AND r.score > 2700
RETURN b AS props, c AS src_cust, r AS relation,  matched

Результат, который я получил ниже, у связанных с извещением узлов нет описывающих их узлов:

enter image description here

Если у меня было два описывающих узла с некоторым свойством (у некоторых может быть список), по которым я хотел бы запросить и построить ожидаемый граф, указанный в пункте 2 выше, как я могу это сделать?

Я хочу, чтобы база данных нашла аналогичного клиента с учетом описывающих узлов. Пример: customer {name: "Dave"} имеет phone {active_number: "+91-12345"}, аналогично customer {name: "Mike"}, имеет phone {active_number: "+91-12345"}. Как можно начать с этим?

Если что-то неясно, пожалуйста, спросите. Я могу объяснить с примерами.

1 Ответ

1 голос
/ 15 апреля 2020

[EDITED]

  1. Да, схема выглядит нормально, за исключением того, что вы не должны использовать один и тот же тип отношения HAS между различными парами меток узлов.
  2. Основная проблема с вашим первым запросом состоит в том, что в его верхнем предложении MATCH используется шаблон отношений направленный , ()-->(), который не позволяет всем узлам Customer иметь шанс стать searched узел (потому что некоторые узлы могут быть только в хвостовой части из SIMILAR отношений). Этот измененный запрос должен работать лучше:

    MATCH (searched:Customer)-[r:SIMILAR]-(matched:Customer)
    WHERE r.score > 2700
    WITH searched, COLLECT(matched) AS matchedList
    WHERE SIZE(matchedList) > 1
    UNWIND matchedList AS person
    MATCH (person)-[:HAS|LIVES_IN|IS_EMPLOYED_BY]->(pDesc)
    WITH searched, person, COLLECT(pDesc) AS personDescribers
    MATCH (searched)-[:HAS|LIVES_IN|IS_EMPLOYED_BY]->(sDesc)
    RETURN searched, person, personDescribers, COLLECT(sDesc) AS searchedDescribers
    
  3. Не ясно, что вы хотите сделать.

  4. Чтобы получить все Customer с одинаковым номером телефона:

    MATCH (c:Customer)-[:HAS_PHONE]-(p:Phone)
    WHERE p.activeNumber = '+91-12345'
    WITH p.activeNumber AS phoneNumber, COLLECT(c) AS customers
    WHERE SIZE(customers) > 1
    RETURN phoneNumber, customers
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...