The goal of my GSoC project was to enhance the graph exploration and query interface of the Internet Yellow Pages (IYP), making it more interactive and user-friendly.
To achieve this, I worked on:
Node Expansion/Unexpansion in Graph View – Allowing users to expand/unexpand nodes dynamically after clicking, enabling deeper exploration of connected data without rerunning queries.
Intelligent Cypher Query Completion – Implementing context-aware code completion that suggests only valid nodes, relationships, and their respective properties, helping users write accurate queries more easily.
Improved Query Editor Experience – Enhancing the Cypher editor with auto-adjusting height according to the cypher query, while maintaining readability by enabling scrolling after a fixed maximum size.
The project follows a modular and incremental approach to add new features to the IYP-Browser, ensuring maintainability and seamless integration with the existing Neo4j-based system.
MATCH (n)
WHERE elementId(n) = $nodeId
MATCH (n)-[r]-(m)
WITH type(r) AS relType, r, m
WITH relType, collect({r: r, m: m}) AS connections
UNWIND connections[..1] AS conn // Samples first connection per relationship type
RETURN conn.r AS rel, conn.m AS target
Added expansion/unexpansion logic in Vue, storing state in expandedNodesMap to track which nodes were expanded and remove only those on unexpansion.
Used emits (nodeExpanded, nodeUnexpanded) to sync changes with the parent component without re-rendering the entire graph.
This feature enhances the query editor in IYP-Browser with intelligent, context-aware autocompletion for Cypher queries.
It uses the Monaco Editor for code editing and relies on regex-based parsing + Neo4j schema data to provide relevant suggestions.
Below are some of the most important regex patterns implemented in this project:
\(\s*\w*\s*:\s*([A-Za-z0-9_]+)
MATCH clause, e.g. (a:Person) → Person.\[\s*\w*\s*:\s*([A-Za-z0-9_]+)(?=[\s\]\-]|$)
[r:FRIENDS_WITH] → FRIENDS_WITH.\b([A-Za-z][A-Za-z0-9_]*)\.\s*([A-Za-z0-9_]*)$
n.name → alias = n, property = name.MATCH\s+(\w+)\s*=\s*\(.*?\)
MATCH p = (a)--(b) → p.\[\s*\{\s*([A-Za-z0-9_]*)$
[{id: 123}].\b(\w+)\s+IN\s+relationships\(\s*(\w+)\s*\)
r IN relationships(p) → r, p.\b(\w+)\s+IN\s+nodes\(\s*(\w+)\s*\)
n IN nodes(p) → n, p.One major advantage of IYP-Browser over the standard Neo4j Browser is the addition of Intelligent Cypher Query Completion, which Neo4j Browser does not provide.
MATCH, WHERE, or within { ... }) and are fetched dynamically from the Neo4j schema.The pull requests that have my work and have been merged.