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

问题描述

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