Neo4j中关系的抽取、修改与可视化

  • Post author:
  • Post category:其他


笔者在一个课题中遇到这样的问题:

由于Neo4j中的Node、Relationship由RDF语义文件导入生成,Node的标签、Relationship的类型可能带有一些前缀(实际上是名称空间),比如:


Mike



Oxford

的关系类型被标记为

Oxf_WorkIn



Oxf

为RDF文件预设的名称空间);


Andy



Cambridge

的关系类型被标记为

Cam_WorkFor



Cam

为名称空间);

如果为了可视化效果更简洁,希望将所有的名称空间前缀都去掉,只保留实际的“关系内容”,即

WorkIn



WorkFor

,应该怎么做?

笔者通过多番尝试,找到一种可行的解决方案,基本思路如下:

(1)按照分隔符抽取实际的关系内容,使用函数

type()



split()



(2)为关系创建一个新的属性,并用上述抽取的关系内容为其赋值;

(3)在视图中指定该属性为关系的可视化属性。

具体代码如下:

MATCH (n)-[r]->(m)
WHERE r.name IS NULL AND split(type(r), "_")[1] IS NOT NULL
SET r.name=split(type(r), "_")[1]
CREATE (n)-[r2:WORK]->(m)
SET r2=r WITH r DELETE r

代码说明:

(1)

CREATE…SET…

这部分语句为可选部分,主要功能是在节点之间创建新的关系

r2

,对关系类型进行统一(这里是统一为

WORK

),将原关系

r

的属性赋给

r2

的同时删除

r

。该操作是为了方便对所有类型为

WORK

的关系设置可视化的属性为

name

。如果不包含这条语句,则需要对每个原关系

r



Oxf_WorkIn



Cam_WorkFor

…)等逐一设置可视化属性为

name

,工作量很大。

(2)

CREATE…SET…

这部分语句虽然方便了统一设置可视化属性,但是可能会带来另外的弊端,即当需要将图数据库导出为RDF文件时,因为关系类型已经改变,可能会导致输出的RDF文件与原文件存在差异,可能需要额外的处理工作。

(3)需要注意的是,对节点的标签、关系的类型只能进行常量赋值,而不能利用函数的返回值赋值,即

n:



r:



n



r

分别为节点、关系变量)后面只能为常量,如:

SET n:PEOPLE
CREATE (n)-[r:WORK]-(m)

是可行的,而:

SET n:labels(n0)[0]
CREATE (n)-[r:type(r0)]-(m)

不可行。

所以,通过提取节点标签和关系类型直接对节点或关系赋值不可行,本文采用了对属性赋值的方式解决问题。



版权声明:本文为weixin_44809084原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。