我有兴趣在图表中同一个类的两个节点之间创建一个边(u,v),如果它们共享一年中的同一天并且v.year = u.year + 1。
说我有vertices.csv:
id,date
A,2014-01-02
B,2015-01-02
C,2016-01-02
D,2013-06-01
E,2014-06-01
F,2016-06-01
我希望看到的边缘结构是这样的:
A --> B --> C
D --> E
F
让我们将顶点类设置为" myVertex"和边缘类是" myEdge"?是否可以使用SQL接口生成这些边缘?
基于this question,我开始尝试这样的事情:
BEGIN
LET source = SELECT FROM myVertex
LET target = SELECT from myVertex
LET edge = CREATE EDGE myEdge
FROM $source
TO (SELECT FROM $target WHERE $source.date.format('MM-dd') = $target.date.format('MM-dd')
AND $source.date.format('yyyy').asInteger() = $target.date.format('yyyy').asInteger()-1)
COMMIT
不幸的是,这并不正确。所以我没有那么雄心勃勃,想要看看我是否可以根据匹配的日期创建边缘:
BEGIN
LET source = SELECT FROM myVertex
LET target = SELECT from myVertex
LET edge = CREATE EDGE myEdge FROM $source TO (SELECT FROM $target WHERE $source.date.format('MM-dd') = $target.date.format('MM-dd'))
COMMIT
哪些仍然有错误...我确信对于经验丰富的OrientDB用户来说这是非常简单的事情。
我考虑过将像Michela suggested on this question这样的JavaScript函数放在一起,但我现在更愿意尽可能多地使用SQL命令。
非常感谢帮助。
其他Stack Overflow References
答案 0 :(得分:2)
我尝试使用OSQL批处理,但我认为你无法得到你想要的东西。
使用whisker OSQL批处理
begin
let a = select @rid, $a1 as toAdd from test let $a1 = (select from test where date.format("MM") == $parent.$current.date.format("MM") and date.format("dd") == $parent.$current.date.format("dd") and @rid<>$parent.$current.@rid and date.format("yyyy") == sum($parent.$current.date.format("yyyy").asInteger(),1))
commit
return $a
我得到了这个
但问题是,当您创建边缘时,无法在上一步中获得的表格上循环。 我认为最好的解决方案是使用JS服务器端功能。 希望它有所帮助。