在更复杂的匹配语句上使用neo4j和cypher的可选相关路径

在更复杂的匹配语句上使用neo4j和cypher的可选相关路径,neo4j,cypher,Neo4j,Cypher,我有一个查询,它正在浏览公司、集团、观察名单和成员的图表。有关数据库中的数据,请参见。我还为任何人设置了一个游戏 查询的目的是获取与组及其相关观察列表有关系的组列表以及成员数量(成员是个人或公司的通用术语) 通过下面的查询,我得到了正确的警报编号,但我缺少“空组”,因为它没有任何成员或观察列表。我曾尝试将各种关系设置为可选关系,但最终导致警报计数错误,因为它使用的是与组相关的观察列表。我尝试过无数种编写查询的方法,但就是无法回避这个问题 START company=node(233), grou

我有一个查询,它正在浏览公司、集团、观察名单和成员的图表。有关数据库中的数据,请参见。我还为任何人设置了一个游戏

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

通过下面的查询,我得到了正确的警报编号,但我缺少“空组”,因为它没有任何成员或观察列表。我曾尝试将各种关系设置为可选关系,但最终导致警报计数错误,因为它使用的是与组相关的观察列表。我尝试过无数种编写查询的方法,但就是无法回避这个问题

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

我担心这将永远不可能与cypher一起实现,因为遍历模式: -如果要计算空组,这意味着没有节点
成员
。想象一下这个简单的回溯:一旦搜索算法没有更多的节点可进入,它只返回一步。由于没有节点
成员
匹配模式将永远不会匹配整个模式
公司-[:拥有]->组-[?:链接到]->观察列表-[:观看|约会*1..2]-成员组-[?:链接到]->观察列表
。因此,当没有找到匹配模式时,结果中也没有数据


-我建议在计数的节点上完成匹配模式,例如
company-[:OWNS]->group-[?:LINKED_to]->watchlist-[:WATCHING |约会*1..2]-member
。您可能会在计数结果中得到零。我试图玩控制台,但它的数据中似乎没有任何空组,因此我无法为您创建最终查询。

我希望我理解正确,但我认为这就是您要寻找的:

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

我知道您说过您尝试了各种关系的可选条件,但为了清楚起见,您尝试过这个吗<代码>公司-[:拥有]->集团-[?:链接到]->观察名单-[:观看|约会*1..2]-成员,公司-[:拥有]->集团-[?:观看]->成员我尝试过一些非常类似的方法,几乎都能奏效,但是,最后一部分返回监视列表中的每个成员,而不是组和监视列表中的成员。是否可以在,这将使提供协助变得更容易。我已经将其添加到问题中,但这里的起始查询不是我在帖子中放置的查询,但它确实显示了三个可见对象的正确警报数量。这只是一个没有出现的问题。你试过使用@ulkas上的一些数据集吗?@PeterNeubauer提问者提供了一个控制台示例,但我无法建立最终的查询。不是我不能;t手动检查图形,因为当我在30个节点上切换可视化时,我的计算机会发疯,我无法操作图形。这里有一个空组,请参阅MrDosu的示例以了解工作查询。非常好,工作完全如我所愿。感谢您澄清了WITH如何也能提供帮助。我刚刚意识到您可以将第2-5行合并到一个查询中,以获得更短的执行计划。虽然我个人不确定WITH关键字的确切性能含义,以及db.hi@MrDosu中优化了多少,但你能帮我写这篇文章吗:谢谢
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