如何使用条件在cypher中返回数据?

时间:2017-04-25 12:18:46

标签: neo4j cypher

我在Neo4j中有一段看起来像enter image description here

的关系

其中(A) - [:关系] - >(B)和(B) - [:关系] - >(C)使用相同的关系(在这种情况下:关系),我想写具有条件的密码查询,以便如果第二级关系(A) - >(C)的计数大于x,则不显示(B) - >(C),即仅显示(A) - >(B)

我尝试过这样的事情:

MATCH(A) WHERE id(A)={id}
OPTIONAL MATCH p=(A)-[:Relationship]->(B)
OPTIONAL MATCH q=(A)-[:Relationship]->(B)-[:Relationship]->(C)
RETURN A, p, CASE WHEN COUNT(q)<10 THEN q ELSE [] END AS foo

问题是foo总是q

2 个答案:

答案 0 :(得分:1)

您是否考虑过匹配最大长度的任意路径?沿着这些方向的东西?

MATCH path=(n:Node {name: {id} })-[:RELATIONSHIP*0..9]->(:Node) 
RETURN PATH

或者,你可以使用APOC,它可以让你参数化路径的深度。

MATCH (one:Node {name : {id} })
CALL apoc.path.expand(one, "RELATIONSHIP>", "+Node", 0, {n}) YIELD path AS p
return p

如果您想从起始节点找到特定深度{n}的所有节点,但只有在它们小于特定阈值{lim}时才返回它们,那么您可以执行类似这样的操作

MATCH (one:Node {name : {id} })
CALL apoc.path.expand(one,"RELATIONSHIP>","+Node", 0, {n}) yield path as p
WITH collect(nodes(p)[{n}]) AS nodes_at_depth
RETURN 
CASE 
  WHEN size(nodes_at_depth) < {lim} then nodes_at_depth
  ELSE []
END AS nodes_at_depth

或者,您可以返回该深度的第一个{lim}节点

MATCH (one:Node {name : {id} })
CALL apoc.path.expand(one,"RELATIONSHIP>","+Node", 0, {n}) yield path as p
WITH collect(nodes(p)[{n}]) AS nodes_at_depth
RETURN nodes_at_depth[0..{lim}] 

答案 1 :(得分:0)

您是否尝试在OPTIONAL MATCH上添加WHERE,以便仅在关系数低于阈值时显示?

function readURLNew(input) {
    this.input = input;
    if (input.files && input.files[0]) {
        var reader = new FileReader();

        reader.onload = function (e) {
            debugger;
            $(input).parent().prev().attr('src', e.target.result);
            $(input).parent().prev().prev().show();
            $(input).parent().prev().show();
        }

        reader.readAsDataURL(input.files[0]);
    }
}
$(function() {
    $(document).on('change','.add_image_new', function() {
        readURLNew(this);
    });
})

重要的是要记住,WHERE子句仅适用于前一个MATCH,OPTIONAL MATCH或WITH,因此在这种情况下,OPTIONAL MATCH将失败,MATCH(A) WHERE id(A)={id} OPTIONAL MATCH p=(A)-[:Relationship]->(B) OPTIONAL MATCH q=(A)-[:Relationship]->(B)-[:Relationship]->(C) WHERE size((B)-[:Relationship]->()) < 10 RETURN A, p, CASE WHEN q IS NULL THEN [] ELSE q END AS foo 将为空时的数量为来自q的次要关系超出了您的阈值。