Neo4j / Cypher - 如何在获取分层数据和转换为树时将可选匹配与路径相关联?

时间:2017-06-14 06:27:18

标签: neo4j cypher

我不确定这个标题是否完全合理,但这就是我想要做的事情。

我有以下查询可以正常工作:

MATCH (n:Thing)-[:has_child*0..]->(m) 
WHERE NOT ()-[:has_child]->(n)
WITH n, m 
ORDER BY n.name, m.name 
MATCH p=(n:Thing)-[:has_child*0..]->(m) 
WITH COLLECT(p) AS ps 
CALL apoc.convert.toTree(ps) yield value 
RETURN value

我还有以下查询,这也很好,在应用程序的另一部分执行(因为我无法一次弄清楚如何):

MATCH (n:Thing {name: {nameParam}})<-[:has_child*]-(m:Thing 
      {btogstate: {btogstateParam}})
RETURN m

所以在第二个查询中发生的是它正在查找链以查看btogstate是否设置为某个值。我想要做的就是将两者结合起来。

有没有人知道如何将第二个查询放入第一个查询中,以便在访问树(值)时我知道该记录有或没有我要查询的值?

希望这是有道理的。我知道这可能不是一个常见的问题。

更新以澄清问题

让我们说我们有一些看起来像这样的分层数据,在DB中它看起来像(伪)(asdf) - [:has_child] - &gt;(qwer) - [:has_child] - &gt ;等等:

--asdf
   -qwer
     -wert
       -erty
--rtyu
   -yuio

现在让我们说我们需要知道是否有&#39; erty&#39;有任何关于btogstate属性设置为false的关系链,并且让我们说qwer确实将此属性设置为false。

然后问题是:如何以一种当你阅读结果(价值)的方式构建查询时,你就知道这个问题是什么?&#39;有一个父母将btogstate设置为false?

2 个答案:

答案 0 :(得分:0)

你在搜索类似的东西:

MATCH p=(n:Thing)-[:has_child*0..]->(m) 
WHERE NOT ()-[:has_child]->(n) AND
      any(node IN NODES(p) WHERE node.btogstate = $btogstateParam )
WITH COLLECT(p) AS ps 
CALL apoc.convert.toTree(ps) yield value 
RETURN value

就像Tom说的那样,我在查询的第一部分进行了重构(结合路径和where子句)。

为了结合您的2个查询,我使用了any函数。

干杯。

答案 1 :(得分:0)

What you are actually looking for - I think - is setting a temporary property that will only show-up in your result. Now, you could actually do that (outside Neo4j) when processing the tree after doing the query. If you want to do it in Neo4j itself the way I would do it is with three queries :

MATCH (m:Thing)<-[:HAS_CHILD*0..]-(n:Thing {btogstate: "true"})
WHERE m <> n
SET m.hasit = "yes";

MATCH (n:Thing)-[:HAS_CHILD*0..]->(m) 
WHERE NOT ()-[:HAS_CHILD]->(n)
WITH n, m 
ORDER BY n.name, m.name
MATCH p=(n)-[:HAS_CHILD*0..]->(m)
WITH COLLECT(p) AS ps
CALL apoc.convert.toTree(ps) yield value 
RETURN value;

MATCH (m:Thing)
REMOVE m.hasit;

A Cypher expert (please chime in :-) can probably do this in one statement. I think that would however not improve the readability.

Hope this helps, Tom