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

jeffmcompsci
Title: Design and Build Great Web APIs - typo “https://company-atk.herokuapp.com/2258ie4t68jv” (page 19, third bullet in URL list) Typo:...
New
Alexandr
Hi everyone! There is an error on the page 71 in the book “Programming machine learning from coding to depp learning” P. Perrotta. You c...
New
mikecargal
Title: Hands-On Rust (Chapter 11: prefab) Just played a couple of amulet-less games. With a bit of debugging, I believe that your can_p...
New
lirux
Hi Jamis, I think there’s an issue with a test on chapter 6. I own the ebook, version P1.0 Feb. 2019. This test doesn’t pass for me: ...
New
jdufour
Hello! On page xix of the preface, it says there is a community forum "… for help if your’re stuck on one of the exercises in this book… ...
New
JohnS
I can’t setup the Rails source code. This happens in a working directory containing multiple (postgres) Rails apps. With: ruby-3.0.0 s...
New
jeremyhuiskamp
Title: Web Development with Clojure, Third Edition, vB17.0 (p9) The create table guestbook syntax suggested doesn’t seem to be accepted ...
New
New
taguniversalmachine
Hi, I am getting an error I cannot figure out on my test. I have what I think is the exact code from the book, other than I changed “us...
New
ggerico
I got this error when executing the plot files on macOS Ventura 13.0.1 with Python 3.10.8 and matplotlib 3.6.1: programming_ML/code/03_...
New

Other popular topics Top

PragmaticBookshelf
Stop developing web apps with yesterday’s tools. Today, developers are increasingly adopting Clojure as a web-development platform. See f...
New
DevotionGeo
I know that these benchmarks might not be the exact picture of real-world scenario, but still I expect a Rust web framework performing a ...
New
AstonJ
I’ve been hearing quite a lot of comments relating to the sound of a keyboard, with one of the most desirable of these called ‘thock’, he...
New
PragmaticBookshelf
Rust is an exciting new programming language combining the power of C with memory safety, fearless concurrency, and productivity boosters...
New
PragmaticBookshelf
Author Spotlight Jamis Buck @jamis This month, we have the pleasure of spotlighting author Jamis Buck, who has written Mazes for Prog...
New
New
AstonJ
This is a very quick guide, you just need to: Download LM Studio: https://lmstudio.ai/ Click on search Type DeepSeek, then select the o...
New
Fl4m3Ph03n1x
Background Lately I am in a quest to find a good quality TTS ai generation tool to run locally in order to create audio for some videos I...
New
PragmaticBookshelf
Lint your docs like code: turn any style guide into enforceable rules with Vale and publish clear, consistent content every time. ...
New
PragmaticBookshelf
Quickly turn complex problems into simple, working solutions using functional programming, safe concurrency, and the expressive tools of ...
New

Sub Categories: