【问题标题】:Cypher query - Combine 2 queries by pipe result of one to otherCypher 查询 - 通过管道结果组合 2 个查询
【发布时间】:2022-01-11 18:56:53
【问题描述】:

我是 cypher 的初学者,想创建一个查询来查找连接到其他节点连接到它们的特定节点的所有节点, see the example

我需要获取连接到蓝色节点所连接的红色节点的所有棕色节点。

对于这个例子,我想获取棕色节点 ID:2、3 和 1(因为没有红色节点需要获取它)

目前我在 2 个不同的查询中执行此操作并使用 python 来查找它,但现在我需要在 1 个查询中执行此操作。

Match (r:R)-[]-(a:A) return collect(a.Id)

第二个查询:

Match (b:B) Optional Match (b)-[]-(a:A) return b.Id, collect(a.Id)

并在我的脚本中检查第二个查询中的每条记录是否是连接到 R 的所有 a.Id 的第一个列表的子集

我可以在 1 个查询中完成吗? 谢谢!

【问题讨论】:

  • 我认为你的意思是你想要棕色节点 2,3,4 但不是 1 因为它不是通过红色节点连接的。对吗?
  • @bechbd 嗨,不,这不是我的意思,我将尝试解释它,换句话说,我需要获取所有棕色节点,如果它们连接到红色节点,则蓝色节点必须连接对于他们所有人,在这个例子中,B-4 没有连接到 3 个红色,但蓝色只连接到其中的 2 个,所以我不想要 B-4。 B-2 和 B-3 连接到蓝色连接的相同红色,所以没关系,对于 B-1 ,因为它没有连接到任何红色,所以没关系,希望它有意义:)

标签: graph neo4j cypher graphdb neptune


【解决方案1】:

改进的答案: 从 :B 节点开始,检查它们的所有 :A 邻居是否都有指向 :R 的链接 如果 :B 没有任何邻居,ALL() 函数也会返回 true

MATCH (b:B)
WHERE ALL(n IN [(b)--(a:A) | a] WHERE EXISTS ((n)--(:R))  ) 
RETURN b

【讨论】:

  • 嗨,谢谢,我理解逻辑但我认为它不会匹配 b-1 节点(因为在 r 和 b 之间没有获取它的路径。虽然我尝试了查询并得到了错误:{ "detailedMessage": "Variable ' REL139' not defined (line 3, column 12 (offset: 108))", "requestId": "a9af83f2-bc32-4a72-ab16-3111cd6e81bb", "code": "MalformedQueryException" } 我的查询是:Match (r:Respondent)--(a:Answer)--(rule:Rule) WITH r, rule, collect(distinct a) as answersNodes with rule, answersNodes WHERE Size([(rule)--(a:Answer) | a]) = SIZE(answersNodes) return distinct rule
  • 是的,你是对的,我忽略了那个案例。我做了第二次尝试
  • 看起来海王星不支持“ALL”功能,我使用的是最新版本1.1.0.0.R1,(错误:不支持'all'谓词功能。)你还有其他选择吗为此?
  • 很奇怪,在他们的文档中没有看到不支持:docs.aws.amazon.com/neptune/latest/userguide/…
  • 好吧,您用“neo4j”标记了您的问题,请注意海王星上的 openCypher 仍然非常有限。另见docs.aws.amazon.com/neptune/latest/userguide/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-07
  • 1970-01-01
  • 2014-11-25
相关资源
最近更新 更多