在更复杂的MATCH语句中使用neo4j和cypher的可选相关路径

时间:2013-03-01 18:45:08

标签: neo4j cypher

我的查询正在查看公司,群组,关注列表和成员的图表。有关数据库中的数据,请参阅gist of dummy data in geoff format。我还为任何人设置了console neo4j

查询的目的是获取一个组列表以及与该组及其相关关注列表有关系的成员数(成员是个人或公司的通用术语)。

通过下面的查询我得到了正确的警报号码,但我缺少“空组”,因为它没有任何成员或关注列表。我已尝试将各种关系设为可选,但它最终会使警报计数错误,因为它使用了与该组相关的关注列表。我已经尝试了无数种编写查询的方法,但却无法解决问题。

START company=node(233), group=node:node_auto_index("_type:group")
MATCH company-[:OWNS]->group-[?:LINKED_TO]->watchlist-[:WATCHING|APPOINTMENT*1..2]-member<-[:WATCHING]-group
RETURN group, COUNT(DISTINCT(member)) as alerts
ORDER BY group.name

理想情况下,我想创建整个路径段,将一个组连接到成员,然后再作为可选项链接到监视列表,但是我无法找到如何在文档中执行此操作,或者这是不可能的。除了做两个查询之外还有其他方法吗?

正确的结果是组和警报应该是:

Big Dot Coms, 1
Big Hitters, 4
Empty group, 0
Old CEOs, 1

2 个答案:

答案 0 :(得分:2)

我希望我理解正确,但我认为这就是你要找的东西:

START company=node:node_auto_index("name:\"Finance Ltd\""), group=node:node_auto_index("_type:group") 
MATCH company-[:OWNS]->group-[?:WATCHING]->member,group-[?:LINKED_TO]->watchlist 
WITH group, member, watchlist 
MATCH watchlist-[:WATCHING|APPOINTMENT*1..2]-member
RETURN group, count(distinct( member)) 
ORDER BY group.name

基本上,您可以使用WITH关键字逐步构建查询。首先获取所有组&lt; - &gt;成员配对,包括不存在的成员配对。然后选择在观察列表中匹配,然后使用最终匹配来应用您的条件并返回结果。

答案 1 :(得分:1)

我担心这对于密码是不可能的,因为遍历模式: - 您想要计算空组,这意味着没有节点member。想象一下这个简单的回溯:只要搜索算法没有更多的节点可以进入,它就会返回一步。由于没有节点member,匹配模式永远不会匹配整个模式company-[:OWNS]->group-[?:LINKED_TO]->watchlist-[:WATCHING|APPOINTMENT*1..2]-member<-[:WATCHING]-group,只会匹配company-[:OWNS]->group-[?:LINKED_TO]->watchlist。因此,当找不到匹配模式时,结果中也没有数据。

-i建议在计算的节点处完成匹配模式,即company-[:OWNS]->group-[?:LINKED_TO]->watchlist-[:WATCHING|APPOINTMENT*1..2]-member之类的东西。比你可能得到计数结果中的零。我试着玩控制台,但似乎它的数据中没有任何空组,所以我无法为你创建最终查询。