neo4j - 组合多个 MATCH 密码查询的收集结果

标签 neo4j cypher

我有一个图表,其中 (:srcType) 之间可以存在三种路径模式和 (:destType) :

  1. 模式一
    (:srcType)<-[]-()<-[]-(srcParent)<-[]-(center)-[]->(destParent)-[]->()-[]->(:destType)
    请注意,这里关系的方向随着路径经过 (center) 而反转: <-[]-(center)-[]->

  2. 模式二
    在这种模式中 (srcParent)它本身就是一个中心。因此关系的方向在(srcParent)之间反转:
    (:srcType)<-[]-()<-[]-(srcParent)-[]->(destParent)-[]->()-[]->(:destType)

  3. 模式三
    在这种模式中 (destParent)它本身就是一个中心。因此关系的方向在(destParent)之间反转:
    (:srcType)<-[]-()<-[]-(srcParent)<-[]-(destParent)-[]->()-[]->(:destType)

我给出的 ID 是 (:srcType)并试图获得所有 (:destType)节点。请注意,给定一个 (:srcType)它可以有一个 (:destType)与其关联的节点遵循第一种模式,另一个遵循第二种模式,还有一些节点遵循第三种模式。我正在尝试检索包含所有这些 (:destType) 的单个集合节点。所以我将上述查询组合如下:

MATCH (src:srcType)<-[]-()<-[]-(srcParent)<-[]-(center)-[]->(destParent)-[]->()-[]->(dest1:destType)
WHERE id(src)=3
WITH dest1
MATCH (src:srcType)<-[]-()<-[]-(srcParent)-[]->(destParent)-[]->()-[]->(dest2:destType)
WHERE id(src)=3
WITH dest1, dest2
MATCH (src:srcType)<-[]-()<-[]-(srcParent)<-[]-(destParent)-[]->()-[]->(dest3:destType)
WHERE id(src)=3
RETURN dest1, dest2, dest3

所以在这里我在 MATCH 中逐一匹配每个模式条款和喂养(:destType) s 输出一个 MATCH到下一个使用 WITH条款。最后我将返回所有 destType秒。

Q1. 但这并没有执行。当我运行其中一种模式(单个 WITH )时,它会正确返回 (:destType) 中的任何一个。匹配路径。但是对于上面的查询,它返回 0 行。为什么会这样?

Q2. 也不是返回所有 destType s,我想返回包含所有元素的单个集合。知道可以使用 + 合并集合, 是否可以返回类似下面的内容?

RETURN destType1+destType2+destType2

注意
之后我需要为每个模式添加不同的过滤器。所以 future 的查询可能看起来像这样:

MATCH (src:srcType)<-[]-()<-[]-(srcParent)<-[]-(center)-[]->(destParent)-[]->()-[]->(dest1:destType)
WHERE id(src)=3 AND srcParent.prop1='a'
WITH dest1
MATCH (src:srcType)<-[]-()<-[]-(srcParent)-[]->(destParent)-[]->()-[]->(dest2:destType)
WHERE id(src)=3 AND destParent.prop2='b'
WITH dest1, dest2
MATCH (src:srcType)<-[]-()<-[]-(srcParent)<-[]-(destParent)-[]->()-[]->(dest3:destType)
WHERE id(src)=3 AND srcParent.prop3='c'
RETURN dest1, dest2, dest3

最佳答案

考虑到这些模式可能存在也可能不存在,并且您希望在最后收集所有结果,一个好的方法是首先在 src 节点上匹配,然后使用可选匹配,并收集结果的方式,添加新的。

如果我们修改您的上一个查询,它可能看起来像这样:

MATCH (src:srcType)
WHERE id(src) = 3
OPTIONAL MATCH (src)<-[]-()<-[]-(srcParent)<-[]-(center)-[]->(destParent)-[]->()-[]->(dest1:destType)
WHERE srcParent.prop1='a'
WITH src, COLLECT(dest1) as dests
OPTIONAL MATCH (src)<-[]-()<-[]-(srcParent)-[]->(destParent)-[]->()-[]->(dest2:destType)
WHERE destParent.prop2='b'
WITH src, dests + COLLECT(dest2) as dests
OPTIONAL MATCH (src)<-[]-()<-[]-(srcParent)<-[]-(destParent)-[]->()-[]->(dest3:destType)
WHERE srcParent.prop3='c'
RETURN dests + COLLECT(dest3) as dests

关于neo4j - 组合多个 MATCH 密码查询的收集结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41395148/

相关文章:

node.js - 使用 Cypher 查询时,数字 Node 属性会四舍五入

neo4j - 在 Cypher CREATE 子句中指定属性的原始类型

neo4j - 使用 neo4j 复制作为架构的一部分

Neo4j 密码查询 : Parenthesis not considered in WHERE clause?

node.js - 查询执行后检测到合并创建的 Node 不匹配

neo4j - 如何使用 Cypher 返回原始节点 5 跳内相关的所有节点

neo4j - 使用集合嵌套密码查询

neo4j - 如何对neo4j中的条件给予优先顺序

java - 服务器崩溃后恢复损坏的 neo4j 数据库 graphdb.NotFoundException

javascript - 如何将变量作为参数传递给 cypher 查询 (neo4j)