如何使用 Neo4j 嵌套查询?

Posted

技术标签:

【中文标题】如何使用 Neo4j 嵌套查询?【英文标题】:How to nest a query with Neo4j? 【发布时间】:2014-05-21 10:29:34 【问题描述】:

我正在尝试在 Java 中执行一种嵌套的 Neo4j 查询,它首先标记节点子集,然后尝试匹配其中的某些模式。更具体地说,它就像组合 2 个这种类型的查询:

1 - MATCH (n)-[r:RELATIONSHIP*1..3]->(m) 设置 m:LABEL

2 - MATCH (p:LABEL)-[r2:RELATIONSHIP]->(q:OTHERLABEL) where r2.time

有没有一种方法可以使用 Java 函数 engine.execute() 将这两个查询合并为一个?

【问题讨论】:

【参考方案1】:

查询#2 中的'p' 通常对应于查询#1 中的'm' 的超集。如果这是您的意图,那么以下应该有效。请注意,这 2 个 MATCH 语句没有公共变量,但 Cypher 语法需要 WITH,因此我随意选择了变量“m”传递给第二个 MATCH(即使它会被忽略)。

MATCH (n)-[r:RELATIONSHIP*1..3]->(m)
SET m:LABEL
WITH m
MATCH (p:LABEL)-[r2:RELATIONSHIP]->(q:OTHERLABEL)
WHERE r2.time<100
RETURN p,r2,q;

如果您希望 'm' 和 ''p' 完全相同,只需将 '(p:LABEL)' 替换为 '(m)':

MATCH (n)-[r:RELATIONSHIP*1..3]->(m)
SET m:LABEL
WITH m
MATCH (m)-[r2:RELATIONSHIP]->(q:OTHERLABEL)
WHERE r2.time<100
RETURN m,r2,q;

【讨论】:

谢谢!是的,我的意思是 m 和 p 完全相同。 @cybersman 以防我还想添加类似: MATCH (p:LABEL)-[r2:RELATIONSHIP]->(q:OTHERLABEL) WHERE r2.time 我知道 Neo4j 不允许我直接指定 WHERE count(p)=3 并且它需要 HAVING 子句,但我一直在尝试这样做,它似乎与 WITH 冲突原因。 试试这个:MATCH (n)-[r:RELATIONSHIP*1..3]->(m) SET m:LABEL WITH m MATCH (m)-[r2:RELATIONSHIP]->( q:OTHERLABEL) WITH m, count(m) AS cm, r2, q WHERE r2.time

以上是关于如何使用 Neo4j 嵌套查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 neo4j .net 客户端中使用密码查询返回两个集合

在Neo4j中,我们如何使用graphql将生成查询后获得的键值对存储到另一个现有节点?

Neo4j中如何计算关系的数量

如何使用Cypher只在Neo4j中获得朋友的朋友

neo4j 密码查询优化

如何优化 Neo4J Cypher 查询?