Optional Lesson
This lesson is optional and will not count towards your achievement.
To view the completed code, check out the 14-person-list
branch.
If you open click on the People link in the main navigation, you will see a paginated list of actors and directors.
People Search
A list of people can be retrieved by calling the http://localhost:3000/people/ endpoint.
The list is populated by the all()
method in the PeopleService
.
async all(q, sort = 'name', order = 'ASC', limit = 6, skip = 0) {
// TODO: Get a list of people from the database
return people.slice(skip, skip + limit)
}
This person lists vary slightly from the movie lists because this features a Search by Name input.
When this value is set, an additional q
parameter is passed to tx.run()
, and if defined, the query adds an additional CONTAINS
predicate.
MATCH (p:Person)
WHERE $q IS NULL OR p.name CONTAINS $q
RETURN p { .* } AS person
ORDER BY p.name ASC
SKIP $skip
LIMIT $limit
Using Text Indexes
TheSTARTS WITH
, ENDS WITH
and CONTAINS
predicates are case-sensitive.
If you are looking for a case-insensitive search, you should consider setting up a full-text schema index.Your Task
-
Modify the
all()
method to query Neo4j and return a list of people. -
If the
q
parameter is defined, add aWHERE
clause to check that thename
property contains the value provided.-
Hint: You can use a conditional operator within the string literal to add this
WHERE
clause.
-
-
Remember to close the session and use the
toNativeTypes()
function within amap()
function onres.records
to convert the values to native JavaScript types.
src/services/people.service.js
→
Click to reveal the completed all()
method
async all(q, sort = 'name', order = 'ASC', limit = 6, skip = 0) {
// Open a new database session
const session = this.driver.session()
// Get a list of people from the database
const res = await session.executeRead(
tx => tx.run(`
MATCH (p:Person)
${q !== undefined ? 'WHERE p.name CONTAINS $q' : ''}
RETURN p { .* } AS person
ORDER BY p.${sort} ${order}
SKIP $skip
LIMIT $limit
`, { q, skip: int(skip), limit: int(limit) })
)
// Close the session
await session.close()
return res.records.map(row => toNativeTypes(row.get('person')))
}
Testing
To test that this functionality has been correctly implemented, run the following code in a new terminal session:
npm run test 14
The test file is located at test/challenges/14-person-list.spec.js
.
Are you stuck? Click here for help
If you get stuck, you can see a working solution by checking out the 14-person-list
branch by running:
git checkout 14-person-list
You may have to commit or stash your changes before checking out this branch. You can also click here to expand the Support pane.
Verifying the Test
What is the name of the first person in the database in alphabetical order?
As part of the test suite, the final test will log the name of the first person to appear in the database in name order.
Paste the name of the person the box below without quotes or whitespace and click Check Answer.
-
✓ 'Snub' Pollard
Hint
You can also find the answer by running the following Cypher statement:
MATCH (p:Person)
RETURN p.name
ORDER BY p.name ASC LIMIT 1
Copy the answer without any double quotes or whitespace.
Lesson Summary
In this Challenge, you implemented the all()
method in the PeopleService
to return a paginated list of people from the Neo4j database and implemented a conditional WHERE
clause on the Person
name
property.
In the next Challenge, you will retrieve an individual’s details from the database.