笔者在一个课题中遇到这样的问题:
由于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)
不可行。
所以,通过提取节点标签和关系类型直接对节点或关系赋值不可行,本文采用了对属性赋值的方式解决问题。