如何在neo4j密码中按节点标签过滤结果?

dfd*_*226 5 neo4j cypher

我有一个图形数据库,用于绘制建筑物和公交车站之间的连接,其中图形包含其他连接件,例如道路和十字路口(在许多节点类型中)。

我试图弄清楚的是如何向下过滤路径以仅返回特定的节点类型。我目前正在努力解决两个相关的问题。

问题1:如何返回路径上的节点标签?

似乎逻辑上的第一步是确定哪种类型沿路径出现的节点。

我尝试了以下方法:

MATCH p=(a:Building)­-[:CONNECTED_TO*..5]­-(b:Bus) 
WITH nodes(p) AS nodes 
RETURN DISTINCT labels(nodes);
Run Code Online (Sandbox Code Playgroud)

但是,我收到一个类型异常错误,labels()需要类型为node而不是Collection的数据。我想动态知道路径上的节点类型,以便最终过滤路径。

问题2:如何在路径中返回与第一步中标识的标签匹配的节点的子集?

说我发现,之间(a:Building)(d1:Bus)(d2:Bus)我可以期望找到(:Intersection)节点和(:Street)节点。

这是我的图形的简化模型:

(a:Building)­­--(:Street)­--­(:Street)--­­(b1:Bus) 
             \­­(:Street)--­­(:Intersection)­­--(:Street)--­­(b2:Bus)
Run Code Online (Sandbox Code Playgroud)

我写了一条MATCH语句,该语句将查找(:Building)(:Bus)节点之间的所有可能路径。接下来,我需要做什么来过滤以选择性地返回Street节点?

MATCH p=(a:Building)-[r:CONNECTED_TO*]-(b:Bus)
  // Insert logic to only return (:Street) nodes from p
Run Code Online (Sandbox Code Playgroud)

任何对此的指导将不胜感激!

cyb*_*sam 6

  1. 要沿匹配路径获取不同的标签:

    MATCH p=(a:Building)-[:CONNECTED_TO*..5]-(b:Bus)
    WITH NODES(p) AS nodes
    UNWIND nodes AS n
    WITH LABELS(n) AS ls
    UNWIND ls AS label
    RETURN DISTINCT label;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 返回具有Street标签的节点。

    MATCH p=(a:Building)-[r:CONNECTED_TO*]-(b:Bus)
    WITH NODES(p) AS nodes
    UNWIND nodes AS n
    WITH n
    WHERE 'Street' IN LABELS(n)
    RETURN n;
    
    Run Code Online (Sandbox Code Playgroud)

  • 如果您使用“WITH p, FILTER(node in NODES(p) WHERE (node:Street)) as street”之类的内容,您可能能够在 2. 中获得更有效的查询。这还允许您保留单独的匹配路径,因为当前查询仅返回街道,但您会丢失路径信息,或者即使有多个路径可用。 (2认同)