Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to filter results by node label in neo4j cypher?

Tags:

neo4j

cypher

I have a graph database that maps out connections between buildings and bus stations, where the graph contains other connecting pieces like roads and intersections (among many node types).

What I'm trying to figure out is how to filter a path down to only return specific node types. I have two related questions that I'm currently struggling with.

Question 1: How do I return the labels of nodes along a path?

It seems like a logical first step is to determine what type of nodes occur along the path.

I have tried the following:

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

However, I'm getting a type exception error that labels() expects data of type node and not Collection. I'd like to dynamically know what types of nodes are on my paths so that I can eventually filter my paths.

Question 2: How can I return a subset of the nodes in a path that match a label I identified in the first step?

Say I found that that between (a:Building) and (d1:Bus) and (d2:Bus) I can expect to find (:Intersection) nodes and (:Street) nodes.

This is a simplified model of my graph:

(a:Building)­­--(:Street)­--­(:Street)--­­(b1:Bus) 
             \­­(:Street)--­­(:Intersection)­­--(:Street)--­­(b2:Bus)

I've written a MATCH statement that would look for all possible paths between (:Building) and (:Bus) nodes. What would I need to do next to filter to selectively return the Street nodes?

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

Any guidance on this would be greatly appreciated!

like image 271
dfd0226 Avatar asked Sep 27 '16 19:09

dfd0226


1 Answers

  1. To get the distinct labels along matching paths:

    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;
    
  2. To return the nodes that have the Street label.

    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;
    
like image 180
cybersam Avatar answered Sep 29 '22 19:09

cybersam