Search code examples
performanceneo4jcyphersubgraphiterated-function

How to fetch a subgraph of first neighbors in neo4j?


I fetch first n neighbors of a node with this query in neo4j: (in this example, n = 6)

I have a weighted graph, and so I also order the results by weight:

START start_node=node(1859988)
MATCH start_node-[rel]-(neighbor)
RETURN DISTINCT neighbor,
rel.weight AS weight ORDER BY proximity DESC LIMIT 6;

I would like to fetch a whole subgraph, including second neighbors (first neighbors of first six children).

I tried smtg like :

START start_node=node(1859988)
MATCH start_node-[rel]-(neighbor)
FOREACH (neighbor | MATCH neighbor-[rel2]-(neighbor2) )
RETURN DISTINCT neighbor1, neighbor2, rel.proximity AS proximity ORDER BY proximity DESC LIMIT 6, rel2.proximity AS proximity ORDER BY proximity DESC LIMIT 6;

the syntax is still wrong but I am also uncertain about the output: I would like to have a table of tuples parent, children and weight: [node_A - node_B - weight]

I would like to see if it is performing better one query or six queries. Can someone help in clarifying how to iterate a query (FOREACH) and format the output?

thank you!


Solution

  • Ok, I think I understand. Here's another attempt based on your comment:

    MATCH (start_node)-[rel]-(neighbor)
    WHERE ID(start_node) IN {source_ids}
    WITH
      neighbor, rel
    ORDER BY rel.proximity
    WITH
      collect({neighbor: neighbor, rel: rel})[0..6] AS neighbors_and_rels
    UNWIND neighbors_and_rels AS neighbor_and_rel
    WITH
      neighbor_and_rel.neighbor AS neighbor,
      neighbor_and_rel.rel AS rel
    MATCH neighbor-[rel2]-(neighbor2)
    WITH
      neighbor,
      rel,
      neighbor2,
      rel2
    ORDER BY rel.proximity
    WITH
      neighbor,
      rel,
      collect([neighbor2, rel2])[0..6] AS neighbors_and_rels2
    UNWIND neighbors_and_rels2 AS neighbor_and_rel2
    RETURN
      neighbor,
      rel,
      neighbor_and_rel2[0] AS neighbor2,
      neighbor_and_rel2[1] AS rel2
    

    It's a bit long, but hopefully it gives you the idea at least