Neo4j:如何添加具有标签名称的列表,并确保资产具有作为列表一部分的标签?

Neo4j:如何添加具有标签名称的列表,并确保资产具有作为列表一部分的标签?,neo4j,cypher,Neo4j,Cypher,我有一个标签叫做“BusinessAssetTypes”。它指定哪些资产是业务资产的一部分。还有一个标签“DataAssetTypes”,指定哪些标签是数据资产的一部分 在下面的查询中,我手动说:业务资产可以是首字母缩略词、业务术语或KPI,数据资产可以是列、表或模式-->查找业务资产和数据资产之间的关系 MATCH (ba)-[rel]->(da) WHERE (ba:Acronym OR ba:BusinessTerm OR ba:KPI) AND (da:Column OR da:

我有一个标签叫做“BusinessAssetTypes”。它指定哪些资产是业务资产的一部分。还有一个标签“DataAssetTypes”,指定哪些标签是数据资产的一部分

在下面的查询中,我手动说:业务资产可以是首字母缩略词、业务术语或KPI,数据资产可以是列、表或模式-->查找业务资产和数据资产之间的关系

MATCH (ba)-[rel]->(da)
WHERE (ba:Acronym OR ba:BusinessTerm OR ba:KPI) 
AND (da:Column OR da:Table OR da:Schema)
RETURN ba, da
问题是,业务资产列表发生了变化。这就是为什么不应该在WHERE子句中手动添加它,而应该从标签“BusinessAssetTypes”中插入它

我已尝试创建一个列表,并在稍后的查询中使用该列表:

MATCH (bat:BusinessAssetType)
WITH collect(bat.name) AS baType
MATCH (dat: DataAssetTypes)
WITH collect(dat.name) AS daType
MATCH (ba)-[rel]->(da)
WHERE ba IS PART OF baType
AND da IS PART OF daType
RETURN ba, da 

提前感谢您的帮助

据我所知,您拥有目标业务资产标签的动态列表和数据资产标签的动态列表。所以我想你要找的是:

MATCH (bat:BusinessAssetType)
MATCH (dat: DataAssetTypes)
WITH collect(DISTINCT bat.name) AS baType, 
     collect(DISTINCT dat.name) AS daType 

MATCH (ba)-[rel]->(da) 
WHERE any(x in labels(ba) WHERE x IN baType)
    AND any(y in labels(da) WHERE y in daType)
RETURN ba, da

一个节点可以有多个标签

您的“业务资产”节点都应该具有
BusinessAsset
标签(而不是
BusinessAssetType
,因为所有标签无论如何都是“类型”)和特定业务资产子类型的第二个标签(如
KPI
)。数据资产也是如此

例如,创建节点时:

CREATE (ba:BusinessAsset:KPI {id: 123, ...})
CREATE (da:DataAsset:Table {id:234, ...})
查询所有连接的业务和数据资产时:

MATCH (ba:BusinessAsset)--(da:DataAsset)
RETURN ba, da

谢谢你的解决方案。这是非常有帮助的!!你知道在没有空白行的情况下,如何收集商业资产的名称(在Cyff:收集(BAT?名称)作为BATYPE)吗?原因是标签没有空格,因此WHERE语句找不到标签。提前非常感谢!我不太明白。这听起来像是数据问题,而不是密码问题。你是说名称属性值(例如bat.name)有空格,但标签没有?您可以使用
replace(bat.name,“,”)
删除空格。如果可能的话,您的数据库也可以从重构中受益。考虑将业务资产节点直接链接到资产类型节点,或者按照@cybersam的建议,在业务资产节点上使用多个标签