【问题标题】:Cypher Query To Ensure All Nodes are in path but other paths can exist密码查询以确保所有节点都在路径中,但其他路径可以存在
【发布时间】:2017-01-26 22:22:55
【问题描述】:

我有一个图表,但需要确保所有节点都在路径中(但路径中可以存在的节点多于这些节点)。

这是一个例子(对不起,不得不把一些东西涂黑):

当我在传入的列表中的所有三个中间节点中都具有相同属性的值时,我想查找 end2 而不是 end1。但是我无法获得将在没有 end1 的情况下返回 end2 的查询。那里可以有更多具有相同路由的节点,但我只会传递不同的值,这些值不会在中间节点上重复。任何人都知道一个查询,它只会给我一个包含来自中间节点的所有值的端节点?还有一些节点挂在这些端节点上,其中一些节点在 end1 和 end2 之间互连。其他一些没有,那些是我不想要的节点,但因为黄色和蓝色之间有一条路径到那一端1我不能使用任何但因为有其他路径到这些相同的节点(未图示)我不能使用全部。

提前感谢您的帮助。

[更新] 这是我使用的当前查询,但它只允许每个开始节点有一个“结束”节点,我想要多个。我需要传入的 id(eg)={eg_id} 但这将其限制为一个。我更愿意使用以下路径中的每个 a 都需要匹配中间节点中的名称属性列表才能到达哪个端节点的事实。因此,如果黄色和蓝色是混合的,那么 end1 和 end2 会回来,但如果黄色、蓝色和紫色都在那里,那么只有 end2 会回来。

start td = node({td_id}) 
match (td:Start)-[:Rel1]->(a)<-[:Rel2]-(eg:End)-[es:Rel3]->(n:WhatsPastEnd) 
with collect(a.name) as pnl, n, td, eg, es 
where id(eg) = {eg_id} 
and all(param_needs in {param_name_list} where param_needs in pnl) 
return n 
order by es.order

[已解决]

非常感谢 InverseFalcon,从下面的解决方案中得到了我需要的东西!

【问题讨论】:

  • 您能否编辑您的描述以提供您迄今为止尝试过的查询?
  • 另外,如果你能提供节点标签,以及关于从开始到结束节点的路径的附加信息,包括允许在开始和结束节点之间遍历的关系类型,以及关于限制的任何信息路径长度?
  • 更新了描述,如果有人可以看一下
  • 您使用的是哪个版本的 Neo4j?

标签: neo4j cypher


【解决方案1】:

好的,我们修改一下你的查询,去掉endnode id的匹配。

start td = node({td_id}) 
// unwind your list of names so every row has a name
with td, {param_name_list} as param_names
unwind param_names as param_name
match (td:Start)-[:Rel1]->(a)
where a.name = param_name
// now a has all nodes with the required names
// collect then unwind so we have the full collection for each a
with collect(a) as requiredNodes
unwind requiredNodes as a
match (a)<-[:Rel2]-(eg:End)
where all(node in requiredNodes where (node)<-[:Rel2]-(eg))
with eg
match (eg)-[es:Rel3]->(n:WhatsPastEnd) 
return n 
order by es.order

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-24
    • 2022-11-11
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 2021-10-03
    相关资源
    最近更新 更多