2014-11-21 2 views
2

В основном, мой вопрос: как я могу суммировать свойства отношений, где есть связанные узлы, которые имеют свойства, равные значению A и значению B?Neo4j: свойства отношения отношения, где свойства узла равны. Значение A и значение B (пересечение)

Например:

У меня простой БД имеет следующее соотношение:

(site)-[:HAS_MEMBER]->(user)-[:POSTED]->(status)-[:TAGGED_WITH]->(tag) 

на [: TAGGED_WITH] У меня есть свойство, называемое "TimeSpent". Я могу легко суммировать все время, затрачиваемое на определенный день и пользователя, используя следующий запрос:

MATCH (user)-[:POSTED]->(updates)-[r:TAGGED_WITH]->(tags) 
WHERE user.name = "Josh Barker" AND updates.date = 20141120 
RETURN tags.name, SUM(r.TimeSpent) as totalTimeSpent; 

Это возвращает мне хороший стол с тегами и связанным с ними время, затрачиваемое на каждый. (т. е. #Meeting 4.5). Однако возникает вопрос, хочу ли я сделать некоторые расширенные поиски и сказать «Покажите мне все встречи для ProjectA» (т. Е. #Meeting #ProjectA). В основном, я ищу запрос, чтобы получить все отношения, в которых один статус имеет BOTH-теги (и только если он имеет оба). Тогда я могу SUM, чтобы подсчитать количество собраний, проведенных в #ProjectA.

Как это сделать?

ответ

2
MATCH (updates)-[r:TAGGED_WITH]->(tag1 {name: 'Meeting'}), 
     (updates)-[r:TAGGED_WITH]->(tag2 {name: 'ProjectA'}) 
RETURN SUM(r.TimeSpent) as totalTimeSpent, count(updates); 

Это должно найти все обновления, отмеченные обеими этими вещами, и суммировать все время, потраченное на все эти обновления.

2

Чтобы создать общее решение, где вы можете хотеть один или несколько тегов вы можете использовать что-то вроде этого, переходя в массив тегов в качестве параметра (и используя длину массива вместо жесткого закодированы 2.

MATCH (user)-[:POSTED]->(update)-[r:TAGGED_WITH]->(tag) 
WHERE user.name = "Josh Barker" AND updates.date = 20141120 AND tag.name IN ['Meeting', 'ProjectA'] 
WITH update, SUM(r.TimeSpent) AS totalTimeSpent, COLLECT(tag) AS tags 
WHERE LENGTH(tags) = 2 
RETURN update, totalTtimeSpent 

пока tag.name индексируется, это должно быть быстрым

Edit -. Удалить ограничение пользователя

MATCH (update)-[r:TAGGED_WITH]->(tag) 
WHERE tag.name IN ['Meeting', 'ProjectA'] 
WITH update, SUM(r.TimeSpent) AS totalTimeSpent, COLLECT(tag) AS tags 
WHERE LENGTH(tags) = 2 
RETURN update, totalTtimeSpent 
+0

Это не должно ограничиваться Джошем Баркером и определенной датой, ОП искал все такие должности. – FrobberOfBits

+0

Справедливая игра, я обновлю. – JohnMark13

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