问题描述
我想使用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]
您能告诉我如何访问带有标签的节点吗?
在我的图形中,每个标签都是唯一的,但是库没有授予它,因此可能是个问题,所以也许我正在寻找一个更好的属性来唯一地标识节点。
感谢您的任何建议!
解决方法
此库将插入带有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",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",oid="F4")
echo g.node("F4")