Neo4j:节点属性等于值A和值B(交集)的和关系属性

时间:2014-11-21 03:13:27

标签: neo4j cypher nodes graph-databases

基本上我的问题是:如何将关系属性求和,其中有一个属性等于值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中花了多少次会议。

我该怎么做?

2 个答案:

答案 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