2015-01-07 3 views
1

У меня есть два запроса cypher и хотелось бы узнать, есть ли возможность получить информацию о точках и HeadHunter в одном заявлении.Возможно объединить эти два запроса

MATCH (s:SEASON)-[*]->(e:EVENT)<-[f:FINISHED]-(p:PLAYER) 
    WHERE s.id = 8 AND e.id <= 1197 
    RETURN p, sum(f.points) AS Points 
    ORDER BY Points DESC 

MATCH (s:SEASON)-[*]->(e:EVENT)<-[el:ELIMINATED]-(p:PLAYER) 
    WHERE s.id = 8 AND e.id <= 1197 
    RETURN p, sum(el.points) AS HeadHunter 
    ORDER BY HeadHunter DESC 

Я играл с разными подходами, но никто из них не работал. Я хотел бы сделать что-то вроде этого:

MATCH (s:SEASON)-[*]->(e:EVENT)<-[el:ELIMINATED]-(p:PLAYER),(e)<-[f:FINISHED]-(p) 
    WHERE s.id = 8 AND e.id <= 1197 
    RETURN p, sum(el.points) AS HeadHunter, sum(f.points) AS Points 

ответ

3

Это работает для вас?

MATCH (s:SEASON)-[*]->(e:EVENT)<-[rel:FINISHED|ELIMINATED]-(p:PLAYER) 
WHERE s.id = 8 AND e.id <= 1197 
WITH p, COLLECT(rel) AS rels 
RETURN p, 
    REDUCE(s = 0, x IN rels | CASE WHEN TYPE(x) = 'FINISHED' THEN s + x.points ELSE s END) AS Points, 
    REDUCE(s = 0, x IN rels | CASE WHEN TYPE(x) = 'ELIMINATED' THEN s + x.points ELSE s END) AS HeadHunter 

Это должно возвращать соответствующие суммы для каждого ИГРОКА, которые либо закончены, либо/или устранены.

+0

Выглядит очень перспективно. Я попробую решение позже сегодня и дам вам отзыв, если он работает так, как ожидалось. – Richard

+0

Идеальное решение для моего случая использования - спасибо. – Richard

+0

Добро пожаловать. Пожалуйста, также Примите мой ответ. – cybersam

1

В принципе, я думаю, что ваш запрос может работать, но вы, возможно, сделали ошибку с p переменной. В этом запросе:

MATCH (s:SEASON)-[*]->(e:EVENT)<-[el:ELIMINATED]-(p:PLAYER),(e)<-[f:FINISHED]-(p) 
    WHERE s.id = 8 AND e.id <= 1197 
    RETURN p, sum(el.points) AS HeadHunter, sum(f.points) AS Points 

Обратите внимание, что p должен быть игроком как с ELIMINATED отношений и в FINISHED отношений. Я предполагаю, что на основе семантики вашего домена это не имеет смысла; вы не можете быть ликвидированы и закончены, правильно?

Таким образом, вы можете попробовать вариант этого:

MATCH (s:SEASON)-[*]->(e:EVENT)<-[el:ELIMINATED]-(pElim:PLAYER),(e)<-[f:FINISHED]-(pFinish) 
    WHERE s.id = 8 AND e.id <= 1197 
    RETURN pElim, sum(el.points) AS HeadHunter, pFinish, sum(f.points) AS Points 

Примечания с этим вы будете иметь много дополнительных строки вывода для различных комбинаций pElim и pFinish, но соответствующие значения должны быть правильными ,

+2

Этот запрос относится только к событиям, у которых есть как отношение к ЛИКВИДАЦИИ, так и отношения FINISHED. Хотя это лучше, чем исходный запрос, это может оказаться неприемлемым. – cybersam

+0

Ах, так OP тоже ищет независимость от объектов Event? Фактические требования к модели в исходном вопросе были расплывчатыми. – FrobberOfBits

+0

Извините @FrobberOfBits, если я был немного неясен в отношении моего usecase и того, как узлы связаны логически. Я довольно новичок во всем материале базы данных графов и, возможно, придется выяснить, какая информация имеет отношение к тому, чтобы задать мои вопросы безошибочно. – Richard

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