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

Popular Pragmatic Bookshelf topics Top

jimmykiang
This test is broken right out of the box… — FAIL: TestAgent (7.82s) agent_test.go:77: Error Trace: agent_test.go:77 agent_test.go:...
New
johnp
Hi Brian, Looks like the api for tinydb has changed a little. Noticed while working on chapter 7 that the .purge() call to the db throws...
New
yulkin
your book suggests to use Image.toByteData() to convert image to bytes, however I get the following error: "the getter ‘toByteData’ isn’t...
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
joepstender
The generated iex result below should list products instead of product for the metadata. (page 67) iex&gt; product = %Product{} %Pento....
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
kolossal
Hi, I need some help, I’m new to rust and was learning through your book. but I got stuck at the last stage of distribution. Whenever I t...
New
New
bjnord
Hello @herbert ! Trying to get the very first “Hello, Bracket Terminal!" example to run (p. 53). I develop on an Amazon EC2 instance runn...
New

Other popular topics Top

AstonJ
What chair do you have while working… and why? Is there a ‘best’ type of chair or working position for developers?
New
ohm
Which, if any, games do you play? On what platform? I just bought (and completed) Minecraft Dungeons for my Nintendo Switch. Other than ...
New
AstonJ
SpaceVim seems to be gaining in features and popularity and I just wondered how it compares with SpaceMacs in 2020 - anyone have any thou...
New
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
Learn different ways of writing concurrent code in Elixir and increase your application's performance, without sacrificing scalability or...
New
AstonJ
Seems like a lot of people caught it - just wondered whether any of you did? As far as I know I didn’t, but it wouldn’t surprise me if I...
New
PragmaticBookshelf
Author Spotlight Rebecca Skinner @RebeccaSkinner Welcome to our latest author spotlight, where we sit down with Rebecca Skinner, auth...
New
PragmaticBookshelf
Author Spotlight: Bruce Tate @redrapids Programming languages always emerge out of need, and if that’s not always true, they’re defin...
New
PragmaticBookshelf
A Ruby-Centric Chat with Noel Rappin @noelrappin Once you start noodling around with Ruby you quickly figure out, as Noel Rappi...
New

Sub Categories: