如何使用Cypher为Neo4J中所有可能的关系和节点绘制“蓝图”?

x8diyxa7  于 2023-04-06  发布在  其他
关注(0)|答案(2)|浏览(140)

我想创建的是我的数据模型的蓝图,我的蓝图是指一个新创建的数据模型,其中每个节点只创建一次;每个节点与一个唯一的标签(与eiter没有,一个或多个标签)从我的真实的数据库必须复制和显示一次。
对于这个蓝图中的每个唯一节点,我也需要一个关系蓝图。所以对于每个不同的关系(无论是名称,方向还是连接的节点),我也只需要一个表示。
例如:假设我有4个节点,其中2个是Persons,2个是Companies;则在蓝图中只显示2个节点。这些是关系:

(c)-[:LIKES]->(p)
(c)-[:LIKES]->(p)
(c)-[:LIKES]->(c)
(c)-[:LIKES]->(c)
(p)<-[DISLIKS]-(c)

这些关系根据名称、方向和连接的节点显示3个唯一关系。因此对于此蓝图,结果必须是2个唯一节点和3个唯一关系。
我一直在努力与代码实现这一点有一段时间。任何建议非常感谢!

sqougxex

sqougxex1#

看来Neo4j内置过程db.schema.visualization()是你正在寻找的:https://neo4j.com/docs/operations-manual/current/reference/procedures/#procedure_db_schema_visualization
示例:

wkftcu5l

wkftcu5l2#

要在Neo4j中创建数据模型的蓝图,您可以使用以下Cypher查询:

MATCH (n)
WITH DISTINCT labels(n) AS labelList, properties(n) AS propertyMap
MERGE (b:Blueprint)-[:HAS_LABEL]->(l:Label{name:labelList})
MERGE (b)-[:HAS_NODE]->(n:Node{properties:propertyMap})
WITH b, id(n) AS nodeId, [(n)-[r]->(m) | type(r)] AS relTypes
UNWIND relTypes AS relType
MERGE (b)-[:HAS_REL_TYPE]->(rt:RelType{name:relType})
WITH b, nodeId, [(n)-[r]->(m) | [type(r), startNode(r).id, endNode(r).id]] AS relList
UNWIND relList AS rel
MERGE (b)-[:HAS_REL]->(r:Rel{type:rel[0], startNodeId:rel[1], endNodeId:rel[2]})

请注意,查询将每个节点的属性存储为Map,以及每个关系的起始和结束节点ID。这允许您在必要时重建原始数据模型。

相关问题