我有一个图形数据库,用于绘制建筑物和公交车站之间的连接,其中图形包含其他连接件,例如道路和十字路口(在许多节点类型中)。
我试图弄清楚的是如何向下过滤路径以仅返回特定的节点类型。我目前正在努力解决两个相关的问题。
问题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)
任何对此的指导将不胜感激!
要沿匹配路径获取不同的标签:
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)返回具有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)