当前位置: 首页 > news >正文

部署GraphRAG配置Neo4j实现知识图谱可视化【踩坑经历】

文章目录

    • 概要
    • 部署graphrag
      • (一)使用conda创建虚拟环境(前提已经安装好anaconda)
      • (二)部署graphrag
    • 部署neo4j
    • graphrag生成的知识图谱导入neo4j
    • 踩坑经历
      • 1.graphrag执行graphrag index --root ./ragtest命令报错
      • 2.neo4j没有Relationship types

概要

在本地部署GraphRag,模型暂时使用的是硅基流动平台的大模型,后续可使用Xinference或者Ollama部署的本地模型。将txt文件喂给Graphrag生成.parquet文件(目前的graphrag好像只支持txt格式的文件)。然后通过python脚本程序将.parquet后缀文件转换成csv格式文件存入neo4j图数据库。使用Cypher语句将知识图谱展示出来。

部署graphrag

官方文档地址:https://microsoft.github.io/graphrag/get_started/

Python 3.10-3.12

(一)使用conda创建虚拟环境(前提已经安装好anaconda)

conda activate graphrag

(二)部署graphrag

1.安装 GraphRAG

pip install graphrag

2.创建input文件夹

mkdir -p ./ragtest/input

RAG需要的txt格式的文件都要放入input文件夹下

3.设置工作区变量

graphrag init --root ./ragtest

这将创建两个文件: and in the directory…envsettings.yaml./ragtest .env包含运行
GraphRAG 管道所需的环境变量。如果检查文件,您将看到定义了一个环境变量 .替换为您自己的 OpenAI 或 Azure API
密钥。GRAPHRAG_API_KEY=<API_KEY><API_KEY>
settings.yaml包含管道的设置。您可以修改此文件以更改管道的设置。

.env文件就是环境变量,一般用来放大模型的apikey之类的参数。在.env文件下放入:

GRAPHRAG_API_KEY=apikey
GRAPHRAG_CLAIM_EXTRACTION_ENABLED=True

settings.yaml就是配置文件,在里面对应修改LLM模型配置和嵌入模型的配置

llm:api_key: ${GRAPHRAG_API_KEY} # set this in the generated .env filetype: openai_chat # or azure_openai_chatmodel: Qwen/Qwen3-8Bmodel_supports_json: true # recommended if this is available for your model.api_base: https://api.siliconflow.cn/v1
embeddings:async_mode: threaded # or asynciovector_store: type: lancedb # one of [lancedb, azure_ai_search, cosmosdb]db_uri: 'output/lancedb'collection_name: defaultoverwrite: truellm:api_key: ${GRAPHRAG_API_KEY}type: openai_embedding # or azure_openai_embeddingmodel: BAAI/bge-m3api_base: https://api.siliconflow.cn/v1

4.运行管道

graphrag index --root ./ragtest

5.提问

下面是一个使用 Global search 提出高级问题的示例:
graphrag query
–root ./ragtest
–method global
–query “What are the top themes in this story?”
下面是一个使用本地搜索询问有关特定角色的更具体问题的示例:
graphrag query
–root ./ragtest
–method local
–query “Who is Scrooge and what are his main relationships?”

部署neo4j

文件下载地址:https://we-yun.com/doc/neo4j/5.21.2/

下载后将tar包上传到服务器指定位置解压

正常来说conf目录下的neo4j.conf文件需要修改一些配置。但是我下的这个版本大部分都不用修改也是可以使用的。唯一值得注意的是:如果下面这个配置是被注释掉的话要放开注释,这个不放开访问可视化页面可能连不上。

server.default_listen_address=0.0.0.0

其他的配置我都是用这个版本内默认的,如果下载的不是这个版本的话可以自行去搜一下都需要改什么然后自行对比一下。

1.启动neo4j
cd 到bin目录下然后执行

./neo4j start

2.停止neo4j

./neo4j stop

3.访问可视化页面
使用web访问http://ip:7474, 默认用户名和密码均为“neo4j”

graphrag生成的知识图谱导入neo4j

在graphrag中执行graphrag index --root ./ragtest命令后,graphrag会将input文件夹中的文件进行解析,在output文件夹下生成.parquet文件。

然后需要准备一个脚本把output/下所有.parquet的文件转换为csv

import os
import pandas as pd
import csvparquet_dir = 'graphrag_cs_glm/ragtest/output/'
csv_dir = 'neo4j-community-4.3.5/import'def clean_quotes(value):if isinstance(value,str):value = value.strip().replace('""','"').replace('"','')if ',' in value or '"' in value:value = f'"{value}"'return valuefor file_name in os.listdir(parquet_dir):if file_name.endswith('.parquet'):parquet_file = os.path.join(parquet_dir,file_name)csv_file = os.path.join(csv_dir,file_name.replace('.parquet','.csv'))df = pd.read_parquet(parquet_file)for column in df.select_dtypes(include=['object']).columns:df[column] = df[column].apply(clean_quotes)df.to_csv(csv_file,index=False,quoting=csv.QUOTE_NONNUMERIC)print(f'数据{parquet_file} to {csv_file} successfull')
print('All parquet files have been converted to CSV.')

目录路径按自己的路径修改

然后打开neo4j可视化页面执行以下命令(注:以下命令在我个人实际操作时并不完全适用,具体情况会在下面踩坑部分详细说明,建议在看完踩坑说明后结合你实际的数据格式选择性使用):

// 1. Import Documents
LOAD CSV WITH HEADERS FROM 'file:///create_final_documents.csv' AS row
CREATE (d:Document {id: row.id,title: row.title,raw_content: row.raw_content,text_unit_ids: row.text_unit_ids
});// 2. Import Text Units
LOAD CSV WITH HEADERS FROM 'file:///create_final_text_units.csv' AS row
CREATE (t:TextUnit {id: row.id,text: row.text,n_tokens: toFloat(row.n_tokens),document_ids: row.document_ids,entity_ids: row.entity_ids,relationship_ids: row.relationship_ids
});// 3. Import Entities
LOAD CSV WITH HEADERS FROM 'file:///create_final_entities.csv' AS row
CREATE (e:Entity {id: row.id,name: row.name,type: row.type,description: row.description,human_readable_id: toInteger(row.human_readable_id),text_unit_ids: row.text_unit_ids
});// 4. Import Relationships
LOAD CSV WITH HEADERS FROM 'file:///create_final_relationships.csv' AS row
CREATE (r:Relationship {source: row.source,target: row.target,weight: toFloat(row.weight),description: row.description,id: row.id,human_readable_id: row.human_readable_id,source_degree: toInteger(row.source_degree),target_degree: toInteger(row.target_degree),rank: toInteger(row.rank),text_unit_ids: row.text_unit_ids
});// 5. Import Nodes
LOAD CSV WITH HEADERS FROM 'file:///create_final_nodes.csv' AS row
CREATE (n:Node {id: row.id,level: toInteger(row.level),title: row.title,type: row.type,description: row.description,source_id: row.source_id,community: row.community,degree: toInteger(row.degree),human_readable_id: toInteger(row.human_readable_id),size: toInteger(row.size),entity_type: row.entity_type,top_level_node_id: row.top_level_node_id,x: toInteger(row.x),y: toInteger(row.y)
});// 6. Import Communities
LOAD CSV WITH HEADERS FROM 'file:///create_final_communities.csv' AS row
CREATE (c:Community {id: row.id,title: row.title,level: toInteger(row.level),raw_community: row.raw_community,relationship_ids: row.relationship_ids,text_unit_ids: row.text_unit_ids
});// 7. Import Community Reports
LOAD CSV WITH HEADERS FROM 'file:///create_final_community_reports.csv' AS row
CREATE (cr:CommunityReport {id: row.id,community: row.community,full_content: row.full_content,level: toInteger(row.level),rank: toFloat(row.rank),title: row.title,rank_explanation: row.rank_explanation,summary: row.summary,findings: row.findings,full_content_json: row.full_content_json
});// 8. Create indexes for better performance
CREATE INDEX FOR (d:Document) ON (d.id);
CREATE INDEX FOR (t:TextUnit) ON (t.id);
CREATE INDEX FOR (e:Entity) ON (e.id);
CREATE INDEX FOR (r:Relationship) ON (r.id);
CREATE INDEX FOR (n:Node) ON (n.id);
CREATE INDEX FOR (c:Community) ON (c.id);
CREATE INDEX FOR (cr:CommunityReport) ON (cr.id);// 9. Create relationships after all nodes are imported
MATCH (d:Document)
UNWIND split(d.text_unit_ids, ',') AS textUnitId
MATCH (t:TextUnit {id: trim(textUnitId)})
CREATE (d)-[:HAS_TEXT_UNIT]->(t);MATCH (t:TextUnit)
UNWIND split(t.entity_ids, ',') AS entityId
MATCH (e:Entity {id: trim(entityId)})
CREATE (t)-[:HAS_ENTITY]->(e);MATCH (t:TextUnit)
UNWIND split(t.relationship_ids, ',') AS relId
MATCH (r:Relationship {id: trim(relId)})
CREATE (t)-[:HAS_RELATIONSHIP]->(r);MATCH (e:Entity)
UNWIND split(e.text_unit_ids, ',') AS textUnitId
MATCH (t:TextUnit {id: trim(textUnitId)})
CREATE (e)-[:MENTIONED_IN]->(t);MATCH (r:Relationship)
MATCH (source:Entity {name: r.source})
MATCH (target:Entity {name: r.target})
CREATE (source)-[:RELATES_TO]->(target);MATCH (r:Relationship)
UNWIND split(r.text_unit_ids, ',') AS textUnitId
MATCH (t:TextUnit {id: trim(textUnitId)})
CREATE (r)-[:MENTIONED_IN]->(t);MATCH (c:Community)
UNWIND split(c.relationship_ids, ',') AS relId
MATCH (r:Relationship {id: trim(relId)})
CREATE (c)-[:HAS_RELATIONSHIP]->(r);MATCH (c:Community)
UNWIND split(c.text_unit_ids, ',') AS textUnitId
MATCH (t:TextUnit {id: trim(textUnitId)})
CREATE (c)-[:HAS_TEXT_UNIT]->(t);MATCH (cr:CommunityReport)
MATCH (c:Community {id: cr.community})
CREATE (cr)-[:REPORTS_ON]->(c);

执行完上述命令后就有可视化的知识图谱了
在这里插入图片描述

踩坑经历

1.graphrag执行graphrag index --root ./ragtest命令报错

[1 rows x 5 columns]
❌ extract_graph
None
⠋ GraphRAG Indexer
├── Loading Input (InputFileType.text) - 1 files loaded (0 filtered) ━ 100% … 0…
├── create_base_text_units ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:00 0:00:00
├── create_final_documents ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:00 0:00:00❌ Errors occurred during the pipeline run, see logs for more details.

然后查看logs日志

{
“type”: “error”,
“data”: “Error running pipeline!”,
“stack”: “Traceback (most recent call last):\n File “/root/miniconda3/envs/graphrag/lib/python3.12/site-packages/graphrag/index/run/run_workflows.py”, line 166, in _run_workflows\n result = await run_workflow(\n ^^^^^^^^^^^^^^^^^^^\n File “/root/miniconda3/envs/graphrag/lib/python3.12/site-packages/graphrag/index/workflows/create_final_community_reports.py”, line 40, in run_workflow\n output = await create_final_community_reports(\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File “/root/miniconda3/envs/graphrag/lib/python3.12/site-packages/graphrag/index/flows/create_final_community_reports.py”, line 83, in create_final_community_reports\n community_reports[“community”] = community_reports[“community”].astype(int)\n ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^\n File “/root/miniconda3/envs/graphrag/lib/python3.12/site-packages/pandas/core/frame.py”, line 4102, in getitem\n indexer = self.columns.get_loc(key)\n ^^^^^^^^^^^^^^^^^^^^^^^^^\n File “/root/miniconda3/envs/graphrag/lib/python3.12/site-packages/pandas/core/indexes/range.py”, line 417, in get_loc\n raise KeyError(key)\nKeyError: ‘community’\n”,
“source”: “‘community’”,
“details”: null
}

现在用的是官方的deepseek-r1。之前搜很多帖子都是整合的ollama本地部署的模型,然后修改了源码增加了ollama相关的包引入。我这个是没有修改过源码的。然后经常出现这种错误,大概意思应该是什么字段没有
以下是询问大模型的回答:

好的,用户在运行GraphRAG时遇到了KeyError: 'community’的错误。我需要先理清错误的原因。错误发生在create_final_community_reports.py的第83行,提示DataFrame中没有’community’列。根据之前的对话,用户已尝试集成DeepSeek-R1模型,可能在数据流程中出现了问题。
首先,为什么’community’列会缺失呢?可能上游的数据处理步骤未生成该列。可能的环节包括社区检测(如Louvain算法)未正确生成该列,或者数据合并时该列被覆盖。另外,列名可能有拼写错误,比如大小写不符或者被其他名称替代。

之前使用其他模型也经常出现这个问题,也更换了好几个LLM模型,后来更换到Qwen-8B那个模型后执行成功。
至今没找出啥原因,因为graphrag是微软的,且目前搜到的资料即使是使用ollama本地部署的也都是国外的模型,好像没有见到用国内的这些模型的,所以推测graphrag是不是对国内这些大模型支持的不是很好。也有可能是嵌入模型的问题。嵌入模型graphrag推荐使用nomic-embed-text。
所以目前遇到这个问题我也只能先更换一个LLM试一试,或者干脆使用国外的模型。

2.neo4j没有Relationship types

正常执行完上面那些命令后就应该把各种node以及node之间的关系建立出来。
在这里插入图片描述

Relationship types下面也应该有关系
在这里插入图片描述
但是在我执行后没有创建出关系,后来结合我的实际数据与Cypher命令分析得出:
上述命令前8项命令没有问题,在第九项开始是创建关系的语句。

以第九项为例,想创建Document和TextUnit的关系,通过textunit的id进行关联Document->TextUnit是一对多的关系,Document有个字段text_unit_ids是TextUnit id的集合,看他这个命令text_unit_ids应该是用","拼接的。

// 9. Create relationships after all nodes are imported
MATCH (d:Document)
UNWIND split(d.text_unit_ids, ‘,’) AS textUnitId
MATCH (t:TextUnit {id: trim(textUnitId)})
CREATE (d)-[:HAS_TEXT_UNIT]->(t);

那我们查看下Document的text_unit_ids字段值

text_unit_ids: ['9b70fba92b0af95992db4b7bad25ea6aee18c870b1cf99eced254aa6e86be1294a45a6d83796380380c0447c074b6ac0833b7983a2d7009e77cb0ddc429b9da4''295bd1cd6e10cf485ff02247554998ba2812c824347f08e05c056018ce3fcbf046a8e10e468f86553ee75720fa1e40bff6d2e2f5bec26fae460a46c763d50bbe''4616f9a9cb2152a3dee2262807c7a0e3dc6c53f0e609aef721834813be137d97450c786c9b9310f5ea3b0b0f0b5ba3d01be6739c4c2cd0999b3aa6aa102a7a24''a786414fdf0963346adf24a54ccb52e5922a9764957a337c7f8e4523359f95d0ca2ced4fbe0c0db9955c1d917366ba8c205ff4c87dc31999850982f430e20427''65535c5ee83c24fbf1fa08ab0f706ea7e082555a18142511d59bd236d09a5a018536b06771357af0a36d29081ed48e9dbe0883cf94da3202663c962887c7d49c''4aff5785ff02d6423797bfc5e2f06df846392063da8a9e1d66e2f7def349896d3ed7c1878ae557c3a34612abe4937470c755ebb08b51c618597315ad03e7e214''63a6d15192092e60f287aaafab563a5d3e63b4c7ad9a6ab1be3d235ba8efedd05036207cd2162e7b2d2deb4beb0d207161a3432d379ddd596641727a0b7a4eb1''3838464887b4d9188fa043c72350f9536127907d969ec7a8d744090467bf69dd955bb0527d7d109ff516f8bd8d1c5a4903854a6cd5be6011aa7211767cbced1f''51faa3c38e1aea56786403f2f53014813c52ad90c5491e4e2ccceb939eb1aa7afad6a510f7dcf893427b6a655af2c02b515a5e93a515dfab557a95647ef39fd1''735eab9577c5bd071830a94e9b170ea98587f76c63b1f629f353b527901e247c0eae66c336f3b2ec4581eebded757c270543005378dd55a51473b29fc4054fb4''0c9879f684c33134ada6aa70255cc526d959047888c86e79014fa289dba08517da20da6ab4adc1e0902ab6440bf3bb87e5ce2ecff688536401b8f64ab3e0af7d''c48cf1c43d6852eb025cb08314e8663e8549ab29f4b1508da9c82cb36cfc0a1aa6dfbfc2d3d31611bfd5d304005b2a82c546d65a776387f5125f3f26ac84d340''2aa69c64daaeac279acc418c10a47a749aba281a2c600d461f2f58ee407ed796e04352b43bfb164690d7c4005c490e30d58d4f121cd552da42944c2259c0f426''03b5b2aa322a393b6e8387356a9ebb78db47880ed659567883b0ffa99d3dc4e891786ed28cbd8fc7193697e48ddabb5c907dd684037f13bc88a1bf6591f6b33f''491a54576db01258de226d7a25c40f88e729d99d885e815cdf013f648bb68a1bf77dfb1c5bb42016b6eca6e62340dda2cb0c9066f66403275ead5a3914cdcedf''bc650903fb1a44f1b5608b9cde1ead46ef7e20a93559aa16d740e098ab7c1e2ab1927ee584cad014ec3b49966f46e3b46814efe1c7061b33824cc196e3eae0ad''470c20085042529fff5b51343fea9ea3e3cfa17da76fd8761154f10d00b4dc4b731429ed05ae77229f3cf98bdf26ffacbfa3d415f575217d2ea9a221344653eb''cbb75357108a143a78035653e45c413649d3448d228e58cf886cd16fbe1d384be447c4d8da2189845798415811f3fb0243607a18f134b311f8f6c995ecb4e2b1''5f19e2706ee08bc64213c03ebdbc5d84482feb44a70b3ca8dca2552512912b01339aa7fc1de0f60ed00b481dda08d38de255c716469753a490af53d65247be1c''5442960a0d9ab2a7c8d2beb0c5ba95aa014bd001d23b959a731341d7e3351800d4c4d6d6ed299622e4c7769f544db4bfd7d20c720f309f205f5f19d4551dea8d''025988f359096c031d033d8f130c248d9d29c79240ebf9f07416d6944d2c618bc0ebffe4d51ba4a8471b240effe05afc32484a7025641acdf602fe5c69a53329''a57338906364aeee7adae9461b994bb768f78e2972180f241e65b73201a486f8e26d918d17b87d76af10f97412278506ef9d157d4ae65f783dbadb622ca5c021''e27365caf1a315d820125c5f4021fa5944580aa682d5458fc6a1a225e0a9d69f5685b782c6ab5f51971f19e0aa84aa61635698545e92dca5d7bffe8863712107''7ad517537f067ccbaa5d4fe7c3016182b4181c3e4b198078edfe55c1fde51fad4318ee85d424e9cb2137d2e2717fc6d30cabd1701418fe4879289d77dea0f201''d429035acea88193d7801b25e47347ca8237dccb52d5920d2d2761dfe54594473044ccb825ec10377fbdc66a92054704c236dda295d1212270153a34b2c5bdf2''1e123d03c4b943315217da0b95debda071e55c0df964d5d37e76cdb8d7a629b0315579f324d1d6e7682c1d346917109e83779b5bdb0a096e57d14eb13b1d3c9b''622b7c028465c608eddccf20f24ffedaf5e14e13427843e90a35e46aece78d1d0c5c35735bcbf939e37e973053ec81aa0b130dfa067a81cb79844bc4601e3d2a''c30ef1d2c5c76f72ccb81adc52039603a1d0fbdfb682659d0dacba22485394d02f10cd9125f26149b9eebbfdc446182afc2ec2c258841b8a7e0530367092ff85''8fb5b781ff48dd0adc3c15f35a233b8c52335cc8becc7f83697ab434060dd8187171a9934ffe705281a0a090aeab3674a78be52b4bd7a92a6fbb4a83fae4ed18''10634e9d97fc24796abb23444431f484767519dd7c68e2368c8467db8994ebb0a7402bee563b2dc905a56518e762d7a0ad73614ddab73ffba9c4c5b8c90509d6''0afee972be08b868dc754dffc886511ce0bde776e406206e8e976043c2f69c786110d849e6751f05fa56163dce208db6310553ceaa6fc12c69e19f740f9b9f06''b6370ee4bf545aa68bfdabc31f451537a46d65447cdcc17004cd3711ae6b3ca5d7bf678843bfc74c682d0af6935ac6f613135d96eebfefbb06008c3c5e05bce4''44acb08460ea4bd9829d336cbddcf2f0ebff4472fd4285dde330b22e574d5c4400693dfb6ac0e90b7f461893378bb3f3966f98d58885f30c93b934a1a11c4384''dea08c83c83a245d2c97b71bf15a280aabc11f787fca894cca6a643de29bec8c700913946a57376805aa21b591fd36a7bccaf3549831f512bb5b4060df273cec''85bb5002bab256245b07849bb7f61f07490835d88ee41d9c8bc466ec0799f1ae488330aaef5347813218ce9303fdfc69a1aee7d46903c8f3bb16a3ae3579c9d1''7b81ac60b45a605c289466d8a94647d4211e869cd87ded97b0d2e54f5a917611e4897db4a042d3a815a95bbf04121433e9ed702ed0d3c2f9253846e1342fba9d''546667dffb5686bbbacf8d41f16aef8c347b2ba4090770d08fe62f0ec0c197331b31ac6d631f8fc8f08c0fec12db37c1a6db54d5460241f052dbb228b28c515f''ddbcf1f874330069195fa47f3c3a40fb31a5a0630167b3f8564bdc13bb2f468c82a74aef01f3dda6faab6a6434e87781a4b36afa41eedfef3d2b4cddd858353d''137f5004343a688dd0cd1ea1aaed375482ac56700e5c870de979451a0fc907af4d63c1a53d3e12c4517f121c08eeda82b6b38d459cebf18b9fc858d68424c78d''cf9df75bfe38ed90d45f4ce6192919a9b8b7ec8e1bfb6bfa7deeeec97aa4ef702974847f9d9057defe50a93d681564573c684f03188a968b30fa9c8782256338''2450f8063b803ecdc21eb0b9f35c95172e188c36e79881d7055250992d1790d91fee68ca3f8eab92c78e925ba916deb587bdc1ad6512671085f3e0992689f7b4''17c3661a97a20b074fb44cc9d8a80ccdbbbfa78aa6c9ed72f10b74a512581dbe3ebe0ad108dcab4b8d24a1bcfceaa544a391540e7a4774585276e534bbcdf930''fbf9442c172bbb90fd4aca64f272a50f21bced55991c3842a4aa1f0236dbea6b5e85cfbdad34a6a0cc8e4422599b5faf6ea2de089980bc9ecf1d49db75a82ef4''b6f9e6881a5fe6397720c0be3336771336e4cc0b795e429499fe02ff8bb7575c5d8f34fc999303a91c9a6d760f9d650065ad2dbb86ad9ba87ecc554ab9ae0440''633ece8a970db68d11b0a1e9c7661337d3c9574cf6ee9b8799788dfd0829c34ebe04142daf9f568627132a5a863e8844813afe526b70c69d5d64fd80ffbeb6b7''341cf5f0b21481582d0d9477061ebf6bf257eef80d638ba32f4c37b0240bb41127beefe323ee621b5f91dc72eeea56b743cb38fc1b06fc0693f5b1f741c18029''6eeaa616335655fa67a808a137785abe2115b31c2248d873053ed96e8112aee5c1775904dafefbd0fe6df3abbb68416b717420726f01e13a84a627fc1300944a''832fbfe498a4298e40b8d6e8affab14de65dc7bd0bd8e40be1128d9472b5fd29a996b734d5dd6b1b6e929bf34b724fb26e06449118fe909d542f0d0f11f83acf''e9ebd8486335d0c9bcf05c1e99ecc4bf31b049bb60ae55e975c09b7a7bba856b329fbe0e9c4269cb25f457cf0ba6bcdea80df4ca3a9fbd24e5a7a36a2fe9a2f5''01415c85dfd6be1927703403340b07ce81b3d2654dfed205d510479bab9b8aee254e079a6fc2d70403df104999b47705f0b566ed5269b1346ccda3d5834a023d''108073c6efe4896628abf2302d47ee95bfd762fa429d4a2bf2b320be5b1ffec44c0592d53b27d6615c3580606ca181366ff556acea32c1fb4ae17f9fbe25018a''4f55284beb8f40e48feccf48dbaf53e611fe7f69e8ca17f1cb9ec23c6b98335a185edaa1543acf34bb902c11335265807514a69ce04655406efdad647d03c480''3dc63e302b054b730408de1fa0f3b8bf25eb12a71843a71c418783ef63addc600e6670b845c5302e7b8a4aea3638d7178ba1dfbb8df40e588a2553d941a2d78f''12997989da098f446d80c4060ab0efc3af6d341d0014bd0ff2e00e0dd9e6207fa7f2a6e4875e22fa2a9c420da6e574924969c6b1fb11e6c392d150cb8f6bb78c''7cf8e3ceb1f001cb04541db3f2b89f5200013ca6388767bb532a99df98032485680a6b8265e7446548789efaf1a8fc68a876e13d7d74ceb7e8a5894b1d06dd7e''6b00966a0ddb4835e95b7f655186f9d728ceddc87e83f6d7e35753584e4693af461571911215b8e22fc2555dba08aa048993ba9914903c4297313c421c74e520''04825e5c51bb45c4e2c676a53bd12c5d0d4a82aa867b5d28294a208d669746f10f2110e94d35ee872b449f03fefad17aedb1816147bfa9e1f31341d1c4438733''a31dbba7a3bb35819c7fa90a6eaa5c62226e48229731b02220ebb286b7cab291ebe146ec0c9a2467ff1f58de19442c17a6af5f8ed6a757e817afee039de72a28''9017caf2f1195cc5b9c159a56780112f3c0caefa4e6acbd84ae1e11c40e24c31ea239c58aaf1a55e893b4b12895f65b5728fc96347c42c23439200b304c69d19''5eaf4b7e5241234c850664d5fcf6dd5f72a7fbe4a7536de0eaae6eda97a618157aaedb795c472f1f2b1d7c5c2b0513e3ec429f97b336452ad0ca446ec5927af5''cb63d0b809d86af0bb9b079d95ad11b4601efc7e4d8ec913acc35c92dda535cfd1f4cc8594c5b25f4219041411545e68e02c56b43d5a9719a9c5768cb26216a6''9bfbed057a487dabe5262c0d08423411eae5c02ce3435789d52223097c6173e49384044e2f03a5e82ae0e74608a5e83368009f0a109c89a5661a402532e5d845''7e88e2683f9a43a605a5410c75cab4b02788b04e09d768cb3848ed8578c296622f7fa1aa8e599ebfcada9501bbb9af7355bec06086e5e1bcdadacff0a2650592''512298196c6482e4881340a02124bc8da2dfbff28f09b820a68cb989c5ba6baaae6095b8320c8cf94f02550d7945ed9748aa523bddec5f1fc9899187fe25e5a7''7d2713f96282da56f84352dc27360a9729262e83ec65eca114657df9a0c738f3af543af7d159b9ec90cbcd3be945430ed0be2703115747584e1548a8d86b019e''03faef22545ecd56e290be7f5aac5a5adf3f175d3020cbd1c2600a8adb5811f6e2d86f1b35a3242df0a4357959031b3e828396c62cbbe5535d85410402f9ea93''2ea162de6127bceb6e5cda56bf4d22c587c0caacb6ec0ad58545685be9ef88a2aee5d66fe13e45ccbdad4c8698e5dbbd56341e88fada504ebf55883f51abd80a''20dd398c52a758702f628260ca4b5e7068ed6bef6673e4363d85ebd6f86b60b73ba4e7da54a6e997eca3f0f921f44bcd7395c44a36dc271a9eab8e2188766300''76edaf4f251f1d78e1f770dd7cf15aee74840df5cf6cd4e193810eb265854a0b3884460866b1b18a428fc58f8dffe4c65515bd559bbab1324d4db2fa742c328a''97a5a4b896dfee20420dbe17c1de0f0473a9f6bc1f2de521d2d97de9e3ce4193b67c5f1623f3ca794e759605fa9168f197214c53cf4c174fe9afb8aeda0bfbdd''ab9f94b821ed6675b65bc945859402464e5727ab4813555c114e1438dbb5f640a5e717d481cc8c5fa428d86d10f001e8f85c71fad1360ce209ed384b73512541']

不知道是哪个环节的问题,我这边相关的所有ids的集合都不是用逗号分隔的。所以这也导致了创建关系失败。
我这边选择修改创建关系的Cypher语句,写法如下:

MATCH (c:Community)
WITH c, replace(replace(c.text_unit_ids, '[', ''), ']', '') AS removed_brackets
WITH c, replace(removed_brackets, "'", "") AS clean_str 
WITH c, replace(clean_str, '\n', ',') AS normalized_str      
UNWIND split(normalized_str, '[,\\s]+') AS relationshipId 
WITH c, trim(replace(relationshipId, '"', '')) AS clean_id   
UNWIND split(clean_id, ',') AS textUnitId
MATCH (t:TextUnit {id: trim(textUnitId)})
CREATE (c)-[:HAS_TEXT_UNIT]->(t);

主要是对空格、换行、括号之类的字符进行处理,最终能切割成单个的id就行。
然后就可以成功创建出关系了。

参考链接:https://blog.csdn.net/2303_78780633/article/details/141064932?spm=1001.2014.3001.5506

相关文章:

  • 用git下载vcpkg时出现Connection was reset时的处理
  • Yolov8的详解与实战-深度学习目标检测
  • 在Spark搭建YARN
  • [:, :, 1]和[:, :, 0] 的区别; `prompt_vector` 和 `embedding_matrix`的作用
  • Pinecone 向量数据库的连接以及增删改查操作讲解
  • 51单片机——交通指示灯控制器设计
  • Tailwind CSS 实战教程:从入门到精通
  • (C语言)超市管理系统(测试2版)(指针)(数据结构)(清屏操作)
  • UI 原型设计:交互规则的三要素——重要性、原则与实践
  • 浅析 Golang 内存管理
  • K8S redis 部署
  • nvrtc环境依赖
  • 数据库常见故障排查
  • Java GUI开发全攻略:Swing、JavaFX与AWT
  • 深入理解SpringBoot中的SpringCache缓存技术
  • 2025年PMP 学习十二 第9章 项目资源管理
  • iOS 阅后即焚功能的实现
  • “海外滴滴”Uber的Arm迁移实录:重构大规模基础设施​
  • 前端实践:打造高度可定制的Vue3时间线组件——图标、节点与连接线的个性化配置
  • Keil5 MDK 安装教程
  • 跨文化戏剧的拓荒者与传承者——洪深与复旦剧社的百年回响
  • 外交部亚洲司司长刘劲松会见印度驻华大使罗国栋
  • 香港暂停进口美国北达科他州一地区禽肉及禽类产品
  • 加强战略矿产出口全链条管控工作部署会召开
  • 城事 | 重庆新增热门打卡地标,首座熊猫主题轨交站亮相
  • 西藏日喀则市拉孜县发生5.5级地震,震源深度10公里