Traversing Graphs
This page is focussed on traversing GraphSlices, i.e. traversing the knowledge graph across "space" at a specific time. ZefDB also provides a similar API to traverse the eternal graph across space and time: traversing eternal graphs
Finding all Attached Atoms
z_person | Outs # show all atoms attached to
z_person | Ins
z_person | ins_and_outs
Filtering on Specific Relation Types
z_person | Outs[RT.FriendOf]
z_person | Ins[RT.FriendOf]
z_person | ins_and_outs[RT.FriendOf]
Why are In, Out, ...
capitalized in contrast to all other ZefOps? There would be a name collision with Python's "in"
keyword.
Accessing "Fields"
Note that the equivalent of fields are relations of a specific type that occur exactly once
z_person | Out[RT.FirstName] # there must be exactly one such relation
The operators In, Out, Ins, Outs, ...
always return ZefRef(s)
Getting Hold of the Relations
In some cases we may not be interested in the atoms connected as source / target of a specified relation, but rather want a ZefRef to the relation itself.
z_person | out_rel[RT.FriendOf] # in case of a one-to-one relation
z_person | out_rels[RT.FriendOf] # varaible number
z_person | in_rel[RT.FriendOf]
z_person | in_rels[RT.FriendOf]
Shorthand Notation
z_person | F.FirstName # returns a value
z_person | Fs.FriendOf # returns a List[ZefRef] if an entity is attached
F
is a shortcut symbol (for "field"): using the dot notation, the expression F.Something
is a ZefOp and has similar behavior to Out[RT.FriendOf]
.
It is slightly more opinionated though:
- If an attribute entity is attached as the target of the traversed relation, the value assigned in that Graph Slice is automatically returned (as opposed to a ZefRef to the attribute entity)
- If an entity or relation is attached as a target, a ZefRef to this is returned.
This is convenient when writing high level code, where you may often be interested in the actual value.
Fs
is the one-to-many counterpart to F
(as Outs
is to Out
).
Filtering on Target Type
z_person | Outs[RT.FriendOf][ET.Dog]
A type can be curried in as a second argument. This can be seen as a form of pattern matching which filters out all nodes connected by both the specified relation set and target type set.