2015-03-17 2 views
1

Предположим, что у меня есть граф, в котором для каждой пары узлов m, n типа BallT может быть узел k типа BallD, который связывает их через отношения типа Rel, могут быть несколько шаблонов вида p=(m:BallT)-[r:Rel]-(k:BallD)-[s:Rel]-(n:BallT). Для данного узла m (удовлетворяющий, например, m.key="whatever"), позвоним Nmn число соединений BallD m и некоторого узла n и N общее число узлов BallD. Для данного узла m как я могу найти все узлы n такие, что Nmn> N/2 и упорядочить результаты по Nnm? Я пытаюсь запрос:Сложный запрос с агрегированием в где пункт

match (D:BallD) 
with count(D) as N 
match (m:BallT {key:"whatever"})-[r]-(d:BallD)-[s]-(n:BallT) 
with N, distinct n as n_dist, count(d) as Nmn 
where Nmn >= N 
return n_dist 
order by Nmn 

, но я получаю

Invalid input 't': expected whitespace, comment, node labels, MapLiteral, a parameter, a relationship pattern 

ответ

2

ли делать этот запрос, что вы хотите?

MATCH (D:BallD) 
WITH count(D) as N 
MATCH (m:BallT {key:"whatever"})--(d:BallD)--(n:BallT) 
WITH N, n, count(d) as Nmn 
WHERE Nmn >= N/2 
RETURN n, Nmn 
ORDER BY Nmn 
  • При использовании функции агрегации (например, count) на значение (например, n), вам не нужно использовать DISTINCT квалифицировать значение, которое вы агрегирования - это будет сделано автоматически вы.

  • Аргумент ORDER BY должен относиться к части возвращаемых значений.

  • Кроме того, я исправил пункт WHERE, чтобы использовать N/2.

+0

Hi cybersam !! Большое спасибо за ваш ответ! Я понимаю, что мой дизайн базы данных не подходит для того, что я пытаюсь сделать! Теперь в каждом узле BallT я храню счет BallD, который связан с ним! Просто это изменение делает все более управляемым .... дизайн базы данных - это искусство, не так ли? : D PS: Ваш запрос полностью работает в моем старом дизайне! :) –

0

Для справок в дальнейшем !! Что я пытался сделать: у меня есть массив ключей ["k1", .., "kn"], которые встречаются на карте d. Для каждого ключа ki (i = 1, .., n) я хочу создать для него узлы (если они еще не созданы), посчитайте количество вхождений ki на этой карте, а также увеличьте общее количество вхождений ki на всех картах, которые я в конечном итоге собираюсь вставлять в базу данных. Чтобы выполнить эту кучу создать я выполнить этот запрос:

create (d:Map) 
with d 
unwind [k1,...,kn] as k0 
with distinct k0 as kd0, count(k0) as c, d 
merge (k:Key {key: kd0}) 
on create set t.count = c, t.mapCount = 1 
on match set t.count = t.count + c, t.mapCount = t.mapCount + 1 
create (d)-[r:Contains {count: c}]->(t) 
return t 

Обратите внимание, что в этом запросе я зарегистрировать общее число вхождений ки в узле, который представляет его и число вхождений его в некотором отображении д в отношения (типа Contains), который связывает оба (извините, мой плохой английский! hehe)

Впоследствии, скажем, я хочу найти все клавиши k, которые совместно встречаются с клавишами [k1, ..., kn] (т.е. , через некоторую карту d), но ограничивается теми ключами k, которые сопутствуют «много» с ki (т. е. количество карт, которые связывают k и ki с i = 1, ..., n больше, чем M), но вообще не встречаются «много» (т. е. число отображений k, вообще говоря, меньше N). В этом случае я выполнить следующий запрос:

unwind [k1,...,kn] as ki 
match (:Key {key: ki})<-[r:Contains]-(d:Map)-[s:Contains]->(k:Key) 
where k.mapCount < N 
with distinct(k) as kd, count(d) as x 
where x > M 
return kd 
order by x desc, kd.count desc 
limit 5 

Обратите внимание, что в этом запросе я упорядочить результаты сначала х (количество карт, которое содержит кий и К) и второго по числу вхождений к, т. е. если два k имеют одинаковые x, то сначала положите k с более высоким счетом.

Большое спасибо за ответы ребятам .... Я никогда не был частым пользователем StackOverflow, но теперь я думаю, что я буду использовать его много! :)

Смежные вопросы