1

我有一个查询,它正在查看公司、组、监视列表和成员的图表。有关数据库中的数据,请参阅geoff 格式的虚拟数据的要点。我还设置了一个控制台 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
4

2 回答 2

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关键字来逐步建立您的查询。首先获取所有组<->成员配对,包括不存在的配对。然后可以选择在监视列表中进行匹配,然后使用最终匹配来应用您的条件并返回结果。

于 2013-03-04T17:08:12.143 回答
1

恐怕这对于 cypher 来说永远不可能,因为遍历模式: - 你想计算空组,这意味着没有节点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. 比你可能在计数结果中得到零。我尝试使用控制台,但它的数据中似乎没有任何空组,所以我无法为您创建最终查询。

于 2013-03-04T08:20:42.477 回答