如何在 "grim" 图中按标签检索节点?

How to retrieve a node by label in a "grim" graph?

我想使用 grim 库来创建和遍历图,但我不明白如何访问具有字符串标签的图。

import  grim
import sequtils


var g = newGraph("my graph")

let node = g.addNode("F4", %(Id: "none", desc: "OK"))
let dest = g.addNode("F8", %(Id: "dest"))

# get node knowing label?
let label1 = "F4"
echo g.node(label1)  # <--- this does not work:

这个脚本returns:

unhandled exception: key not found: F4 [KeyError]

你能告诉我如何访问具有标签的节点吗?

在我的图表中,每个标签都是唯一的,但它不是由库授予的,所以这可能是个问题,所以也许我正在寻找一个更好的属性来唯一地标识一个节点。

感谢任何建议!

此库插入带有 oid 的节点。如果你添加一个没有 oid 的节点,它会自动生成,它将成为在 g.node(oid) 中查找的索引。但是你可以强制给定的oid,例如

import oids
import grim

var g = newGrap("my graph")
let myOid: string = $genOid()

let node = g.addNode("F4", %(Id: "none", desc: "OK"), oid=myOid)

echo g.node(myOid)

记得为您插入的每个节点/边创建一个新的 oid,否则它们将不会被插入:

let myoid = "dontdothis"

let node = g.addNode("F4", %(Id: "none", desc: "OK"), oid=myoid)
let dest = g.addNode("F8", %(Id: "dest"), oid=myoid) # Oh, no! Reusing myoid!

echo g
# <Graph "my graph" with 1 node(s) {"F4": 1} and 0 edge(s) {:}>
# Ops! dest node missing

记住g.addNode returns oid 对应插入的节点,所以你总是可以这样做:

echo g.node(node)
echo g.node(dest)

原因是您可以插入多个具有相同标签的节点,但它们会得到不同的 oid。如果您想按标签提取节点:

for node in g.nodes("F4"):
  echo node
  # Also available
  # node.label
  # node.oid

如果您 100% 确定您的标签是唯一的,只需将标签作为 oid:

let node = g.addNode("F4", %(Id: "none", desc: "OK"), oid="F4")
echo g.node("F4")