mvellandi

mvellandi

Exploring Graphs with Elixir: Missing behaviour import, struct, cypher file (p.181)

Exploring Graphs with Elixir by @tonyhammond: P.181 — Ch 5 > Setting Up a Graph Service > API Demo

After starting iex in the umbrella project, then importing PropertyGraph, we are told to call:

iex>​​ ​​default_graph​​ ​​=​​ ​​read_graph(​​"default.cypher"​​)​
​ 	​#GraphCommons.Graph<type: property, file: "...", data: "CREATE (a)-[:EX]...">

However, read_graph hasn’t been defined yet.
We need to first add the following to the PropertyGraph module:

use GraphCommons.Graph, graph_type: :property, graph_module: __MODULE__

From that read_graph call, I don’t recall creating nor seeing the “default.cypher” in the source codebase:
graph_commons/priv/storage/property/graphs/default.cypher

I believe perhaps a cypher file with the following should work:

CREATE (a)-[:EX]->(b)

Shortly later, we call:

iex>​​ ​​graph_info​
​%GraphCommons.Service.GraphInfo{
​ 	  labels: [],
​ 	  num_edges: 1,
​ 	  num_nodes: 2,
​ 	  type: :property
​}

For me, this returned an undefined function error for PropertyGraph.new_query/1
So I looked at the definition of graph_info/0 in the book’s previous section on p.182

def​ graph_info() ​do​
​ 	  {​:ok​, [stats]} =
​ 	    @cypher_info
​ 	    |> PropertyGraph.new_query()
​ 	    |> query_graph
​ 	
​ 	  %GraphCommons.Service.GraphInfo{
​ 	    ​type:​ ​:property​,
​ 	    ​num_nodes:​ stats[​"​​nodeCount"​],
​ 	    ​num_edges:​ stats[​"​​relCount"​],
​ 	    ​labels:​ Map.keys(stats[​"​​labels"​])
​ 	  }
​ end

I noticed
1:
Although GraphCommons.Query hasn’t been formally defined, by duplicating GraphCommons.Graph to GraphCommons.Query
and changing “graph” to “query” references and checking the module’s source codebase, we should have a new_query/3 function.

However, PropertyGraph.new_query is called here with only 2 out of 3 arguments: @cypher_info and (implicitly) the query_type
Is there a missing argument for query_file ?
I couldn’t figure this out.

2:
And for graph_info/0 to return a %GraphCommons.Service.GraphInfo{} struct, I believe we need to first define the module which I didn’t see in the source codebase. So I made one here:
graph_commons/lib/graph_commons/service/graph_info.ex

Searching the source codebase for GraphInfo structs, I found the following attributes variously used, and so defined the module as follows:

defmodule GraphCommons.Service.GraphInfo do
    defstruct ~w[type num_nodes num_edges labels density file]a
end

First Post!

mvellandi

mvellandi

Regarding #1 above, getting PropertyGraph.new_query to work with one or two arguments:
I revised the definition of “using” macro in GraphCommons.Query to use a default arg:

def new_query(query_data, query_file \\ "") do
   if unquote(query_type) in [:dgraph, :native, :property, :rdf, :tinker] do
      GraphCommons.Query.new(query_data, query_file, unquote(query_type))
   end
end

Simple fix.
A code editor’s language server may need some time to recognize this as not an issue.

If you now run PropertyGraph.graph_info/0 again and get this next error below (like I did):

{ :error,
   %Bolt.Sips.Error{
      code: "Neo.ClientError.Procedure.ProcedureNotFound", 
      message: "There is no procedure with the name `apoc.meta.stats` registered for this database instance. Please ensure you've spelled the procedure name correctly and that the procedure is properly deployed."
   }
}

It means APOC-Core, included with Neo4j, hasn’t been added as a plugin.
Lastly, the Neo4j security settings configuration may need a one-line config for enabling plugin/other resource full database access.
I’ve written another post on DevTalk with how I installed Neo4j on OSX.

Cheers

Where Next?

Popular Pragmatic Bookshelf topics Top

iPaul
page 37 ANTLRInputStream input = new ANTLRInputStream(is); as of ANTLR 4 .8 should be: CharStream stream = CharStreams.fromStream(i...
New
ianwillie
Hello Brian, I have some problems with running the code in your book. I like the style of the book very much and I have learnt a lot as...
New
HarryDeveloper
Hi @venkats, It has been mentioned in the description of ‘Supervisory Job’ title that 2 things as mentioned below result in the same eff...
New
New
Chrichton
Dear Sophie. I tried to do the “Authorization” exercise and have two questions: When trying to plug in an email-service, I found the ...
New
leonW
I ran this command after installing the sample application: $ cards add do something --owner Brian And got a file not found error: Fil...
New
AndyDavis3416
@noelrappin Running the webpack dev server, I receive the following warning: ERROR in tsconfig.json TS18003: No inputs were found in c...
New
jskubick
I found an issue in Chapter 7 regarding android:backgroundTint vs app:backgroundTint. How to replicate: load chapter-7 from zipfile i...
New
AufHe
I’m a newbie to Rails 7 and have hit an issue with the bin/Dev script mentioned on pages 112-113. Iteration A1 - Seeing the list of prod...
New
rainforest
Hi, I’ve got a question about the implementation of PubSub when using a Phoenix.Socket.Transport behaviour rather than channels. Before ...
New

Other popular topics Top

AstonJ
If it’s a mechanical keyboard, which switches do you have? Would you recommend it? Why? What will your next keyboard be? Pics always w...
New
PragmaticBookshelf
Brace yourself for a fun challenge: build a photorealistic 3D renderer from scratch! In just a couple of weeks, build a ray tracer that r...
New
AstonJ
If you are experiencing Rails console using 100% CPU on your dev machine, then updating your development and test gems might fix the issu...
New
PragmaticBookshelf
Use WebRTC to build web applications that stream media and data in real time directly from one user to another, all in the browser. ...
New
AstonJ
Saw this on TikTok of all places! :lol: Anyone heard of them before? Lite:
New
PragmaticBookshelf
Rails 7 completely redefines what it means to produce fantastic user experiences and provides a way to achieve all the benefits of single...
New
New
PragmaticBookshelf
Programming Ruby is the most complete book on Ruby, covering both the language itself and the standard library as well as commonly used t...
New
PragmaticBookshelf
Author Spotlight: Peter Ullrich @PJUllrich Data is at the core of every business, but it is useless if nobody can access and analyze ...
New
NewsBot
Node.js v22.14.0 has been released. Link: Release 2025-02-11, Version 22.14.0 'Jod' (LTS), @aduh95 · nodejs/node · GitHub
New

Sub Categories: