基本上我的问题是:如何将关系属性求和,其中有一个属性等于值A和值B的相关节点?
例如:
我有一个简单的DB有以下关系:
(site)-[:HAS_MEMBER]->(user)-[:POSTED]->(status)-[:TAGGED_WITH]->(tag)
On [: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),则会出现问题。基本上,我正在寻找一个查询,我可以得到所有关系,其中单个状态有两个标签(并且只有两者都有)。然后我可以将这个数字用来计算我在#ProjectA中花了多少次会议。
我该怎么做?
答案 0 :(得分:2)
MATCH (updates)-[r:TAGGED_WITH]->(tag1 {name: 'Meeting'}),
(updates)-[r:TAGGED_WITH]->(tag2 {name: 'ProjectA'})
RETURN SUM(r.TimeSpent) as totalTimeSpent, count(updates);
这应该找到所有标记有这两种内容的更新,并将所有时间花在所有这些更新上。
答案 1 :(得分: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
被编入索引,这应该很快。
修改 - 删除用户约束
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