Week 10 - Cypher Queries

This week's lab focuses on writing and understanding Cypher queries. Let's use the database that we created last week (week 9 lab sheet) as the example.

1. READ

Write queries that find each of the following:

  1. All nodes in the database.

MATCH (n) RETURN n
  1. All products in the database.

MATCH (n:Product) RETURN n
  1. Up to 5 products in the database.

MATCH (n:Product) RETURN n LIMIT 5
  1. All products whose prices are greater than 20. We will talk about toFloat() in Section 2. UPDATE.

MATCH (n:Product)
WHERE toFloat(n.purchasePrice) > 20
RETURN n
  1. All sales which contain a product with the brand "Mega".

MATCH (s:Sale)-[:CONTAINS]->(p:Product {brand: "Mega"})
RETURN s

Alternatively, If you don't need to reference the "Product" node itself, you can simplify the query by removing "p".

MATCH (s:Sale)-[:CONTAINS]->(:Product {brand: "Mega"})
RETURN s
  1. All shops that have sales of a product with the brand "Mega".

  1. Same query as 6, but return the path.

  1. In this example dataset, our relationships don't have properties. However, what if we need to query based on a property of a relationship? Let's assume there's a "year" property on the "SOLD_IN" relationship. Here's how you can modify the query to include this relationship property:

If there's a "year" property on the "SOLD_IN" relationship, the query should be:

The output of the above query should be (no changes, no records) as there is no "year" property on the "SOLD_IN" relationship.

circle-exclamation
  1. Find the path with a length of 4 from the product with ID "TAB_1" to the product with ID "TSH_9":

For more information on path queries: https://neo4j.com/developer-blog/the-power-of-the-path-1/arrow-up-right

circle-info

NOTE: All the variables used in the queries, such as "s", "n", and "p", are self-defined. You can replace these variable names with any valid variable name of your choice.

2. UPDATE

Sometimes, records such as product price might need updating. Instead of uploading a new CSV file, we can write queries to update the information directly in the database.

  1. Updates a product's price to a different price.

Check the current price of the product with ID: "BED_3" and its type:

Figure 1: checking property types from RETURN clause

Alternatively, you can return the node and hover over the property to see its type:

Figure 2: checking property types from nodes

You can see that the purchasePrice is stored as a string. This is because when we created nodes from a CSV file (see Week9), we did not specify the price as a float, so Neo4j automatically treated every variable as a string.

Two methods to change the type:

Method 1: Changing the type when creating the database from a CSV file, you can use conversion functions such as toInteger(), toFloat(), toString(), toBoolean(). You can learn more about these functions in the Neo4j documentation: Scalar functionsarrow-up-right

For example:

In this example, toFloat() is used to convert the purchasePrice property from a string to a float during node creation.

Method 2: Updating the type aftering creating:

circle-exclamation
Figure 3: checking property types from RETURN clause (after updated)

Now, let's update the price:

circle-exclamation

3. DELETE

  1. Deletes a specific shop in the database

  1. Deletes a relationship between a specific Shop and a specific Sale

circle-exclamation

Last updated