如何使用 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 客户端中使用密码查询返回两个集合