我不确定这个标题是否完全合理,但这就是我想要做的事情。
我有以下查询可以正常工作:
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?
答案 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