私は、グラフ データベースの REST API ラッパーにすぎない R パッケージに取り組んできました。クラスとcreateNode
オブジェクトを返す関数があります:node
entity
# Connect to the db.
graph = startGraph("http://localhost:7474/db/data/")
# Create two nodes in the db.
alice = createNode(graph, name = "Alice")
bob = createNode(graph, name = "Bob")
> class(alice)
[1] "node" "entity"
> class(bob)
[1] "node" "entity"
createRel
データベース内の 2 つのノード間の関係を作成する別の関数 があります。次のように指定されます。
createRel = function(fromNode, type, toNode, ...) {
UseMethod("createRel")
}
createRel.default = function(fromNode, ...) {
stop("Invalid object. Must supply node object.")
}
createRel.node = function(fromNode, type, toNode, ...) {
params = list(...)
# Check if toNode is a node.
stopifnot("node" %in% class(toNode))
# Making REST API calls through RCurl and stuff.
}
を使用...
すると、ユーザーはキー = 値の形式で関係に任意の数のプロパティを追加できます。例えば、
rel = createRel(alice, "KNOWS", bob, since = 2000, through = "Work")
これにより、db に (Alice)-[KNOWS]->(Bob) の関係が作成され、プロパティsince
とthrough
それぞれの値が作成されます。ただし、ユーザーがキーfrom
または引数to
でプロパティを指定すると...
、R は と のクラスについて混乱しfromNode
ますtoNode
。
key でプロパティを指定するとfrom
、 のクラスについて混乱が生じfromNode
ます。使用していcreateRel.default
ます:
> createRel(alice, "KNOWS", bob, from = "Work")
Error in createRel.default(alice, "KNOWS", bob, from = "Work") :
Invalid object. Must supply node object.
3 stop("Invalid object. Must supply node object.")
2 createRel.default(alice, "KNOWS", bob, from = "Work")
1 createRel(alice, "KNOWS", bob, from = "Work")
同様に、ユーザーが keyto
でプロパティを指定すると、 のクラスについて混乱が生じtoNode
、 で停止しますstopifnot()
。
Error: "node" %in% class(toNode) is not TRUE
4 stop(sprintf(ngettext(length(r), "%s is not TRUE", "%s are not all TRUE"),
ch), call. = FALSE, domain = NA)
3 stopifnot("node" %in% class(toNode))
2 createRel.node(alice, "KNOWS", bob, to = "Something")
1 createRel(alice, "KNOWS", bob, to = "Something")
パラメータを明示的に設定するとうまくいくことがわかりましたcreateRel
:
rel = createRel(fromNode = alice,
type = "KNOWS",
toNode = bob,
from = "Work",
to = "Something")
# OK
createRel
しかし、次の構文がエラーなしで機能するように、関数をどのように編集する必要があるのか 疑問に思っています。
rel = createRel(alice, "KNOWS", bob, from = "Work", to = "Something")
# Errors galore.
この問題を開いた GitHub ユーザーは、とsetAs
という引数を持つ on dispatch との競合である可能性が最も高いと述べました。解決策の 1 つは、削除して次のように変更することです。from
to
...
createRel
createRel = function(fromNode, type, toNode, params = list()) {
UseMethod("createRel")
}
createRel.default = function(fromNode, ...) {
stop("Invalid object. Must supply node object.")
}
createRel.node = function(fromNode, type, toNode, params = list()) {
# Check if toNode is a node.
stopifnot("node" %in% class(toNode))
# Making REST API calls through RCurl and stuff.
}
しかし、この変更を行う前に、他のオプションがあるかどうかを確認したかった.