Saving and evaluating network paths in Neo4j
Saving Expenses
If the stored network is huge, running a query with an arbitrarily long chain of relations will usually take too long; limiting this to two or three levels saves a huge amount of time. What's more, if the database does not have to look forever for a suitable starting point for a route, your queries will run faster. For example, if the starting node for the search is already defined, a directive such as:
START n=node:router_index(name='guest')
can define the starting point for the match command. The prerequisite for this step is that the start router has been stored previously in a Neo4j index under the specified key (name
).
Listing 2 does this in lines 35 and 36 with the add_entry()
method. For simpler applications, the Neo4j Server offers an autoindex
option; it determines which attributes to index automatically.
In Figure 5, the query first finds all wireless routers that have a wireless
attribute set to 1
. The example network has only one, although a more complex installation will probably have many more, increasing the number of routes found leading to the Internet. Using this information, you could, for example, periodically run automatic security checks that prevent a network packet from a wireless network reaching a protected internal network because of a configuration error.
![](/var/linux_magazin/storage/images/issues/2014/164/perl-neo4j/figure-5/618660-1-eng-US/Figure-5_large.png)
Two-Sided Anchors
The search pattern for the match statement can use more complex anchors. The query in Figure 6 searches the entire network for any router, n
, that is used as a gateway on both sides. To do this, you need to compose a query with three router variables (here, m
, n
, and o
) with a relation from left to right between the first two routers and another relation from right to left between the router at the end and the router in the middle. ASCII art makes this possible.
Neo4j tries to find such a constellation and outputs the results: The router merger
matches the queried pattern. The two results have the same paths as equivalents with opposite orientation.
Finding the Edge
In the search to determine which devices on the network forward packets to the Internet, Listing 3 uses Perl to dispatch a Cypher query and anchors the match pattern to end at the router belonging to the DSL modem. The CPAN REST::Neo4p::query module runs the query and uses the fetch()
method, which takes the results trickling in from the server in JSON format and returns them as paths. The latter consist of two lists, one with nodes and one with the intermediate relations.
Listing 3
router-search
The nodes()
and relationships()
methods dig the nodes and relations out of the path objects. The only task remaining for the for
loop at the end is to extract the names of the devices by means of get_property()
and output the sole matching result route by using arrows as symbols:
guest->merger->modem
Queries of this type happen quickly and are obviously easy to formulate.
As Figure 7 demonstrates, you can easily install the Neo4j server on Ubuntu and other Debian derivatives using the Debian repository server, as described on neo4j.org. Following this, the daemon starts automatically, as a call to curl http://localhost:7474
confirms by returning the server status in JSON format.
« Previous 1 2 3 4 Next »
Buy this article as PDF
(incl. VAT)
Buy Linux Magazine
Subscribe to our Linux Newsletters
Find Linux and Open Source Jobs
Subscribe to our ADMIN Newsletters
Support Our Work
Linux Magazine content is made possible with support from readers like you. Please consider contributing when you’ve found an article to be beneficial.
![Learn More](https://www.linux-magazine.com/var/linux_magazin/storage/images/media/linux-magazine-eng-us/images/misc/learn-more/834592-1-eng-US/Learn-More_medium.png)
News
-
NVIDIA Released Driver for Upcoming NVIDIA 560 GPU for Linux
Not only has NVIDIA released the driver for its upcoming CPU series, it's the first release that defaults to using open-source GPU kernel modules.
-
OpenMandriva Lx 24.07 Released
If you’re into rolling release Linux distributions, OpenMandriva ROME has a new snapshot with a new kernel.
-
Kernel 6.10 Available for General Usage
Linus Torvalds has released the 6.10 kernel and it includes significant performance increases for Intel Core hybrid systems and more.
-
TUXEDO Computers Releases InfinityBook Pro 14 Gen9 Laptop
Sporting either AMD or Intel CPUs, the TUXEDO InfinityBook Pro 14 is an extremely compact, lightweight, sturdy powerhouse.
-
Google Extends Support for Linux Kernels Used for Android
Because the LTS Linux kernel releases are so important to Android, Google has decided to extend the support period beyond that offered by the kernel development team.
-
Linux Mint 22 Stable Delayed
If you're anxious about getting your hands on the stable release of Linux Mint 22, it looks as if you're going to have to wait a bit longer.
-
Nitrux 3.5.1 Available for Install
The latest version of the immutable, systemd-free distribution includes an updated kernel and NVIDIA driver.
-
Debian 12.6 Released with Plenty of Bug Fixes and Updates
The sixth update to Debian "Bookworm" is all about security mitigations and making adjustments for some "serious problems."
-
Canonical Offers 12-Year LTS for Open Source Docker Images
Canonical is expanding its LTS offering to reach beyond the DEB packages with a new distro-less Docker image.
-
Plasma Desktop 6.1 Released with Several Enhancements
If you're a fan of Plasma Desktop, you should be excited about this new point release.