Предложение Neo4J WITH не дает записи при добавлении свойства - PullRequest
0 голосов
/ 12 марта 2020

Просто новичок в Neo4J и попробуйте использовать предложение WITH следующим образом:

MATCH (card:Card)-[:BELONGS]-(customer:Customer)
WITH customer, COUNT(DISTINCT card) as n_cards
WHERE n_cards > 3
RETURN customer

И это на самом деле работает хорошо, но когда я добавляю тип узла card в предложении WITH, он дает Ничего / пусто, когда оно не было пустым с предыдущим запросом:

MATCH (card:Card)-[:BELONGS]-(customer:Customer)
WITH customer, COUNT(DISTINCT card) as n_cards, card # here the 'card' is added
WHERE n_cards > 3
RETURN customer

И вышеупомянутый запрос ничего не дает мне. Я не фильтровал.

Конечная цель состоит в том, чтобы сделать это:

MATCH (card:Card)-[:BELONGS]-(customer:Customer)
WITH customer, COUNT(DISTINCT card) as n_cards, card # here the 'card' is added
WHERE (n_cards > 3 AND card.country == "US")
RETURN customer, card

Не могли бы вы объяснить, почему он дал пустой результат, когда я только добавил тип узла и даже не фильтруется?

Ответы [ 2 ]

2 голосов
/ 12 марта 2020

Агрегирующие функции , такие как COUNT, используют неагрегирующие термины в том же предложении WITH или RETURN в качестве "ключей группировки".

Итак, добавляя card к условию WITH вы заставляете n_cards всегда равняться 1, что приводит к сбою теста WHERE.

Это должно работать:

MATCH (card:Card)-[:BELONGS]-(customer:Customer)
WHERE card.country = "US"
WITH customer, COLLECT(card) AS cards
WHERE SIZE(cards) > 3
RETURN customer, cards

Кроме того, это запрос не использует DISTINCT при сборе карточек, поскольку customer, вероятно, не будет иметь несколько связей BELONGS с одним и тем же узлом card.

1 голос
/ 12 марта 2020

'карточка', в вашем запросе не метка (которая, кстати, является 'Карточка'), а заполнитель для узла, так как вы сделали

(card:Card)

Кроме того, функция COUNT () будет сгруппировать по отдельной комбинации клиент / карта, и поскольку вы добавили «карточку», n_cards всегда будет равно 1, поэтому n_cards> 3 всегда будет ложным.

MATCH (card:Card)-[:BELONGS]-(customer:Customer)
WHERE card.country = 'US'
WITH customer, COLLECT(DISTINCT card) AS cards
WHERE SIZE(cards) > 3 
RETURN customer, cards

, вероятно, будет работать, если вы хотите увидеть клиенты, которые имеют> 3 карты США

, вот что вы можете сделать, если хотите продолжить обработку клиентов и карт ..


// instead of RETURN , use WITH
WITH customer, cards   

// UNWIND the cards as individual nodes
UNWIND cards AS card    

// e,g, get transactions
WITH customer,card

OPTIONAL MATCH (card)-[t:TRANSACTION]->(m:Merchant)

RETURN customer.name AS customer,
                card.number AS cardNumber,
                t.amount AS amount,
                m.name AS merchant

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