0

我想使用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:

此脚本返回:

unhandled exception: key not found: F4 [KeyError]

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

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

感谢您的任何建议!

4

1 回答 1

2

该库使用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返回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")
于 2020-08-19T16:03:45.370 回答