Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
链接列表中neo4j可选匹配的行为非常奇怪_Neo4j_Cypher - Fatal编程技术网

链接列表中neo4j可选匹配的行为非常奇怪

链接列表中neo4j可选匹配的行为非常奇怪,neo4j,cypher,Neo4j,Cypher,我有一种链表结构: (root:`Desk`)-[:linked_list*0..]->(article:`Article`)-[:linked_list]->...-[:linked_list]->(root:`Desk`) 要查询列表中的所有元素,我使用以下查询: MATCH (r)-[:linked_list]->(e) WHERE ID(r) = {r_id} AND r <> e RETURN e 我试图将结果可视化,结果如下: 它似乎用

我有一种链表结构:

(root:`Desk`)-[:linked_list*0..]->(article:`Article`)-[:linked_list]->...-[:linked_list]->(root:`Desk`)
要查询列表中的所有元素,我使用以下查询:

MATCH (r)-[:linked_list]->(e) 
WHERE ID(r) = {r_id} 
AND r <> e 
RETURN e
我试图将结果可视化,结果如下:

它似乎用数据库的所有值填充
r
e


知道为什么会这样吗?

我相信你真正想做的是这样的事情。找到
链接列表
项,然后对每个
e
匹配项执行可选匹配

MATCH (r)-[:linked_list]->(e) 
WHERE ID(r) = {r_id} 
AND r <> e
WITH e 
OPTIONAL MATCH (e)-[:author]->(a:`User`) 
RETURN e, collect(a) as authors
匹配(r)-[:链接列表]->(e)
其中ID(r)={r_ID}
和r e
带e
可选匹配(e)-[:author]->(a:`User`)
返回e,以作者身份收集(a)

您观察到的行为有两个原因:

  • WHERE
    子句仅过滤其前一个
    MATCH
    子句
  • 未能匹配的
    可选匹配
    子句不会从先前的
    匹配
    子句中删除任何结果
  • 第一个
    MATCH
    子句匹配all相邻的
    r
    e
    节点(因为它后面没有紧跟
    WHERE
    子句)

    第二个
    MATCH
    子句由
    WHERE
    子句过滤。但是,由于它是一个
    可选匹配
    子句,未能满足
    WHERE
    子句不会消除第一个
    匹配
    找到的任何匹配

    因此,您需要将
    WHERE
    子句放在第一个
    MATCH
    子句之后(类似于@DaveBennett的答案),以便执行您想要的筛选

    MATCH (r)-[:linked_list]->(e) 
    WHERE ID(r) = {r_id} 
    AND r <> e
    WITH e 
    OPTIONAL MATCH (e)-[:author]->(a:`User`) 
    RETURN e, collect(a) as authors