neo4j 如何为路径中返回的节点指定基于标签的属性列表

trnvg8h3  于 2022-12-23  发布在  其他
关注(0)|答案(1)|浏览(183)

我有一个密码查询返回一个相当大的图,有不同的节点标签和关系类型。我想通过只检索节点和关系的有用属性来优化它的网络负载。
如何过滤节点和关系属性的Map而不改变图形路径?即保留每个元素(节点和关系),但是对于每个返回的节点或关系,根据标签只获取其属性的子集。
例如:对于每个:个人只返回名字、姓氏和出生日期对于每个:业务只返回ID和邮政编码对于类型为WORK_AT的每个关系返回工作标题和开始日期。
注:在本例中,有些节点是多标签的,它可能是一个人的企业,具有两个标签:Person:Business,并且这些节点应该返回个人和公司的属性集。

46scxncf

46scxncf1#

可以使用APOC函数返回virtual nodesrelationships及其属性的子集。
基于电影图的示例

MATCH path = (n:Person)-[r]->(:Movie)<-[r2]-(o:Person)
UNWIND relationships(path) AS rel
WITH apoc.create.vRelationship(
    apoc.create.virtual.fromNode(
        startNode(rel),
        CASE 
            WHEN 'Person' IN labels(startNode(rel)) THEN ['name']
            WHEN 'Movie' IN labels(startNode(rel)) THEN ['title']
        END
    ),
    type(rel),
    // assuming for rels we return all properties
    rel{.*},
    apoc.create.virtual.fromNode(
        endNode(rel),
        CASE 
            WHEN 'Person' IN labels(endNode(rel)) THEN ['name']
            WHEN 'Movie' IN labels(endNode(rel)) THEN ['title']
        END
    )
) AS vrel
RETURN startNode(vrel), endNode(vrel), vrel

将返回只有名称的Person节点和只有标题的Movie节点

您需要了解这方面的某些限制:

  • apoc.create.virtual.fromNode将生成节点对象,但节点的id将为-id(originalNode) - 1(此处引用)
  • 虚拟关系的ids将是随机负数,如果知道id很重要,可以将其作为计算值添加到关系的属性中,例如:
// assuming for rels we return all properties + ID of the relationship
    rel{.*, __id: id(rel)},

然后生产

  • 请小心,因为在开始时使用虚拟节点/关系可能会导致多次返回相同关系的错误

相关问题