部署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
相关文章:
部署GraphRAG配置Neo4j实现知识图谱可视化【踩坑经历】
文章目录 概要部署graphrag(一)使用conda创建虚拟环境(前提已经安装好anaconda)(二)部署graphrag 部署neo4jgraphrag生成的知识图谱导入neo4j踩坑经历1.graphrag执行graphrag index --root ./ragtest命令报错2.neo4j没有Relationship types 概要 在本地部署GraphRag࿰…...
跨域的几种方案
因为浏览器出于安全考虑,有同源策略。也就是说,如果协议、域名、端口有一个不同就是跨域,Ajax 请求会失败。 我们可以通过以下几种常用方法解决跨域的问题 JSONP JSONP 的原理很简单,就是利用 <script> 标签没有跨域限制…...
5 WPF中的application对象介绍
WPF Application 类提供了一系列生命周期事件,了解它们的触发顺序对于应用程序开发非常重要。以下是主要事件的触发顺序 1. 主要事件顺序 Startup - 应用程序启动时触发 这是第一个触发的事件 适合在此处初始化应用程序级资源 可以在此取消启动(通过设置e.Cancel = true) Act…...
Nexus首次亮相迪拜 TOKEN2049:以“手机 + 钱包 + 公链 + RWA”生态系统引领未来区块链基建
迪拜,2025年5月—— 全球 Web3 基础设施创新平台 Nexus,在本年度迪拜 TOKEN2049 全球峰会 上完成了其主网与全生态系统的首次国际公开亮相。此次参会不仅展示了 Nexus 的国际生态布局,更标志着其迈出了全球化战略关键一步。凭借对现实世界资产…...
C++ 套接字函数详细介绍
目录 头文件1. 套接字创建与配置2. 绑定地址与端口3. 连接建立4. 数据传输5. 套接字选项6. 地址转换7. 套接字关闭8. 其他实用函数 C 套接字函数详细介绍 套接字(Socket)是网络通信的基本端点,C中通常使用BSD套接字API进行网络编程。以下是主要的套接字相关函数及其…...
WordPress 和 GPL – 您需要了解的一切
如果您使用 WordPress,GPL 对您来说应该很重要,您也应该了解它。查看有关 WordPress 和 GPL 的最全面指南。 您可能听说过 GPL(通常被称为 WordPress 的权利法案),但很可能并不完全了解它。这是有道理的–这是一个复杂…...
机器人示教操作
机器人基础操作 **ES机器人试教操作知识** **1. 视角移动** **1.1 基础模式** - 关节轴控制:通过关节1至关节6实现单轴正反转移动 - 直线移动:通过X/Y/Z坐标轴沿指定方向直线移动 - 旋转移动:通过RX/RY/RZ坐标轴绕指定轴旋转 **1.2 步进模式…...
【python】UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xb2
报错 C:\Users\zhangbin\AppData\Local\Programs\Python\Python310\python.exe D:\XTRANS\cuda\03-graph-db\04-cmkg\pdf2zh-v1.9.9-with-assets-win64\pdf2zh\gui.py Traceback (most recent call last): File “D:\XTRANS\cuda\03-graph-db\04-cmkg\pdf2zh-v1.9.9-with-asset…...
[python] python静态方法,类方法,实例方法实现及其区别
一 静态方法 格式: 使用 staticmethmod 装饰器修饰 应用: 某个方法既不需要使用实例属性也不需要使用类属性时,就可以考虑使用静态方法 注意: 静态方法与类无关,可以被转换成函数使用,属于类本身 1.1 经典示例 创建一个与日期相关的辅助函数,这些函数不需要访问或修改类的…...
Kite AI 自动机器人部署教程
最近比较火的AI赛道,每日自动对话训练AI,赚积分 一个个用于 Kite AI 平台的自动交互机器人,支持多钱包和代理。 登记 注册链接 🌟 功能 多钱包支持(手动输入或基于文件) 代理支持(HTTP/HTTP…...
50. Pow(x, n)
50. Pow(x, n) 分治法的基本思想是将一个大问题分解成若干个相同或相似的小问题,递归地解决这些小问题,然后将这些小问题的解合并起来得到原问题的解。 class Solution:def myPow(self, x: float, n: int) -> float:# 内部定义了一个嵌套的辅助函数…...
Go 语言 sqlx 库使用:对 MySQL 增删改查
MySQL 作为目前最流行的开源关系型数据库,其 SQL 语法体系已形成行业标准,相关知识体系庞大且成熟,本文不再对 SQL 基础进行详细展开,建议尚未掌握的读者先行系统学习。本文聚焦于如何使用 Go 语言进行 MySQL 数据库操作ÿ…...
反射, 注解, 动态代理
文章目录 单元测试什么是单元测试咱们之前是如何进行单元测试的? 有啥问题 ?现在使用方法进行测试优点Junit单元测试的使用步骤删除不需要的jar包总结 反射认识反射、获取类什么是反射反射具体学什么?反射第一步:或者Class对象 获…...
继续预训练 LLM ——数据筛选的思路
GPT生成数据微调qwen-2.5多模态模型实战项目 作者:柠檬养乐多 原文地址:https://zhuanlan.zhihu.com/p/30645776656 qwen2.5-vl是阿里通义实验室推出的qwen系列最新多模态大模型,在许多指标上已经超过或接近了gpt-4o。更为方便的是࿰…...
深入解析 PostgreSQL 外部数据封装器(FDW)的 SELECT 查询执行机制
引言 PostgreSQL 中的外部数据封装器(Foreign Data Wrapper, FDW)是一种扩展,允许您像访问 PostgreSQL 数据库中的表一样,访问和操作存储在外部数据源中的数据。FDW 使 PostgreSQL 能够与多种数据存储系统(包括关系型…...
数据库系统概论|第六章:关系数据理论—课程笔记2
前言 前文我们介绍了规划化的基本概念,同时引入了关于规范化的相关定义与基本概念,低一级范式的关系模式,通过模式分解,可以转换为若干个高一级范式的关系模式的集合,这种过程就叫规范化。本文将围绕范式展开讨论&…...
package-lock.json能否直接删除?
package-lock.json能否直接删除? package-lock.json 生成工具:由 npm 自动生成。 触发条件:当运行 npm install 时,如果不存在 package-lock.json,npm 会创建它;如果已存在,npm 会根据它精确安…...
Ubuntu磁盘空间分析:du命令及常用组合
1、du命令的作用 du(Disk Usage)是 Ubuntu 系统中用于查看目录或文件磁盘使用情况的命令,主要用于分析磁盘空间占用。 2、语法 du [选项] [目录/文件路径]常用选项 2.1、-h 以 KB、MB、GB 等人性化可读格式(Human-readable&am…...
《数据库原理》部分习题解析1
《数据库原理》部分习题解析1 1. 名词解释 (1)关系(2)属性(3)域(4)元组(5)码(6)分量(7)关系模式 ࿰…...
汇川Easy系列PLC数据值改变功能块(随动增益改变判断)
PLC值改变事件 值改变触发功能块 PLC值改变事件 值改变触发功能块(SCL ST完整源代码)-CSDN博客文章浏览阅读1.1k次。本文介绍了在PLC中处理值改变事件的方法,包括值改变触发功能块的实现,详细讲解了FB接口定义、ST代码,并提供了在博途平台上的实现。此外,还分享了如何利用…...
数据清洗的艺术:如何为AI模型准备高质量数据集?
数据清洗的艺术:如何为AI模型准备高质量数据集? 引言 在人工智能和机器学习领域,我们常常听到"垃圾进,垃圾出"(Garbage in, garbage out)这句格言。无论你的模型架构多么精妙,算法多么先进,如果…...
怎么查看当前vue项目,要求的node.js版本
怎么查看当前vue项目,要求的node.js版本 找到 package.json package-lock.json 搜索 node...
游戏引擎学习第278天:将实体存储移入世界区块
总结并为今天的内容做好铺垫 今天的内容是关于开发一个完整的实体系统,目标是让这个系统更加实际和有效。之前讨论了如何通过一个模拟区域来处理无限大的世界。最初,使用浮动点数而不是双精度浮点数来避免潜在的精度问题,因为一些平台&#…...
计算机组成与体系结构:缓存设计概述(Cache Design Overview)
目录 Block Placement(块放置) Block Identification(块识别) Block Replacement(块替换) Write Strategy(写策略) 总结: 高速缓存设计包括四个基础核心概念…...
在Linux中如何使用Kill(),向进程发送发送信号
kill()函数 #include <sys/types.h> #include <signal.h> int kill(pid_t pid, int sig); 函数参数和返回值含义如下: pid:参数 pid 为正数的情况下,用于指定接收此信号的进程 pid;除此之外,参数 pid 也可设置为 0 或-1 以及小于-1 等不同值,稍后给说明。 …...
ElasticSearch重启之后shard未分配问题的解决
以下是Elasticsearch重启后分片未分配问题的完整解决方案,结合典型故障场景与最新实践: 一、快速诊断定位 检查集群状态 GET /_cluster/health?pretty # status为red/yellow时需关注unassigned_shards字段值 2.查看未分配分片详情 …...
基于 Spring Boot 瑞吉外卖系统开发(十四)
基于 Spring Boot 瑞吉外卖系统开发(十四) 查询订单 在管理端的首页,单击左侧菜单栏中的“订单明细”,会在右侧打开订单明细页面。 请求路径:/order/page 请求方法:GET 参数:page pageSize …...
【软件测试】第二章·软件测试的基本概念
🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏:🏀软件测试与软件项目管理_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 …...
部署安装gitlab-ce-17.9.7-ce.0.el8.x86_64.rpm
目录 编辑 实验环境 所需软件 实验开始 安装部署gitlab171.配置清华源仓库(版本高的系统无需做)vim /etc/yum.repos.d/gitlab-ce.repo 2.提前下载包dnf localinstall gitlab-ce-17.9.7-ce.0.el8.x86_64.rpm --rocklinux 3.修改配…...
2025五一杭州西湖三天游
2025五一杭州西湖三天游 文章目录 2025五一杭州西湖三天游一、前言二、杭州游玩记录三、杭州三日游小结四、杭州美食街1、河坊街2、胜利河美食街3、高银街4、中山南路美食街5、武林夜市6、啦喜街美食广场7、大兜路美食街 五、豆包推荐的杭州三日游攻略三天主要行程**第一天&…...
实验五:以太网UDP全协议栈的实现(通过远程实验系统)
文章目录 FPGA以太网:从ARP到UDP的完整协议栈一、引言二、核心模块详解1. ARP协议处理模块1.1 `arp_cache`:ARP缓存模块1.2 `arp_tx`:ARP请求与应答发送模块1.3 `arp_rx`:ARP接收与解析模块2. MAC层处理模块2.1 `mac_layer`:MAC层顶层模块2.2 `mac_tx_mode`:MAC发送模式选…...
现代计算机图形学Games101入门笔记(八)
三角形三点已经知道在uv的位置了,那三角形内部的点,怎么算。 先看A 任一点 面积比求 根据三点坐标属性差值出内部点的位置。 纹理太小了,映射处理方式,取邻近的Nearest感觉一格格的,取周围4个权重Bilinear,取4*4Bicubi…...
C语言学习之文件操作
经过前面的学习,我们已经基本掌握了如何去写一个C语言的代码了。但是在实际的项目中,我们不可能不需要文件去操作。因为如果没有文件,我们写的程序是存储在电脑的内存中的。如果程序推出,内存回收数据就随之丢失了。如果我们要对数…...
《AI大模型应知应会100篇》第63篇:AutoGPT 与 BabyAGI:自主代理框架探索
第63篇:AutoGPT 与 BabyAGI:自主代理框架探索 摘要 随着大语言模型(LLM)技术的不断演进,自主代理(Autonomous Agent) 正在成为 AI 应用的新范式。它不仅能够理解用户意图,还能自主规…...
使用大模型预测急性结石性疾病技术方案
目录 1. 数据预处理与特征工程伪代码 - 数据清洗与特征处理数据预处理流程图2. 大模型构建与训练伪代码 - 模型训练模型训练流程图3. 术前预测系统伪代码 - 术前风险评估术前预测流程图4. 术中实时调整系统伪代码 - 术中风险预警术中调整流程图5. 术后护理系统伪代码 - 并发症预…...
基于运动补偿的前景检测算法
这段代码实现了基于运动补偿的前景检测算法。 主要功能包括: 运动补偿模块:使用基于网格的 KLT 特征跟踪算法计算两帧之间的运动,然后通过单应性变换实现帧间运动补偿。前景检测模块:结合两帧运动补偿结果,通过帧间差…...
鸿蒙OSUniApp开发富文本编辑器组件#三方框架 #Uniapp
使用UniApp开发富文本编辑器组件 富文本编辑在各类应用中非常常见,无论是内容创作平台还是社交软件,都需要提供良好的富文本编辑体验。本文记录了我使用UniApp开发一个跨平台富文本编辑器组件的过程,希望对有类似需求的开发者有所启发。 背景…...
W5500使用SocketTool工具测试
W5500使用SocketTool工具测试 1、按“WINR” 2、输入“IPCONFIG”,得到计算机的IP地址,子网掩码和网关 3、设置W5500设备网络参数如下: 本地网关:192.168.1.1 本地子网掩码: 255.255.255.0 本地物理地址:0C 2…...
《Python星球日记》 第71天:命名实体识别(NER)与关系抽取
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、命名实体识别(NER)基础1. 什么是命名实体识别&#…...
双向长短期记忆网络-BiLSTM
5月14日复盘 二、BiLSTM 1. 概述 双向长短期记忆网络(Bi-directional Long Short-Term Memory,BiLSTM)是一种扩展自长短期记忆网络(LSTM)的结构,旨在解决传统 LSTM 模型只能考虑到过去信息的问题。BiLST…...
CentOS7原有磁盘扩容实战记录(LVM非LVM)【针对GPT分区】
一、环境 二、命令及含义 fdisk fdisk是一个较老的分区表创建和管理工具,主要支持MBR(Master Boot Record)格式的分区表。MBR分区表支持的硬盘单个分区最大容量为2TB,最多可以有4个主分区。fdisk通过命令行界面进行操…...
如何在终端/命令行中把PDF的每一页转换成图片(PNG)
今天被对象安排了一个任务: 之前自己其实也有这个需要,但是吧,我懒:量少拖拽,量大就放弃。但这次躲不过去了,所以研究了一下有什么工具可以做到这个需求。 本文记录我这次发现的使用 XpdfReader 的方法。…...
【0415】Postgres内核 释放指定 memory context 中所有内存 ④
1. frees all memory (memory context) Postgres内核中由函数 AllocSetReset() 完成该功能。即 “释放给定set中分配的所有内存。” 它应当将所有已分配的chunks标记为已释放,但不一定需要归还set所拥有的全部资源。我们的实际实现是,除了“保留”块(“keeper” block)(…...
2025年Flutter初级工程师技能要求
在2025年,随着移动应用市场的持续增长和跨平台开发需求的不断增加,Flutter已经成为许多公司构建高性能、跨平台应用的首选框架。对于初入职场的Flutter初级工程师来说,掌握以下技能要求是必不可少的。这些技能不仅能够帮助你在工作中快速上手…...
AWS技术助力企业满足GDPR合规要求
GDPR(通用数据保护条例)作为欧盟严格的数据保护法规,给许多企业带来了合规挑战。本文将探讨如何利用AWS(亚马逊云服务)的相关技术来满足GDPR的核心要求,帮助企业实现数据保护合规。 一、GDPR核心要求概览 GDPR的主要目标是保护欧盟公民的个人数据和隐私权。其核心要求包括: 数…...
MVCC:数据库并发控制的利器
在并发环境下,数据库需要处理多个事务同时访问和修改数据的情况。为了保证数据的一致性和隔离性,数据库需要采用一些并发控制机制。MVCC (Multi-Version Concurrency Control,多版本并发控制) 就是一种常用的并发控制技术,它通过维…...
第二章、Isaaclab强化学习包装器(3):SKRL Wrapper
0 前言 官方文档:https://isaac-sim.github.io/IsaacLab/main/source/api/lab_rl/isaaclab_rl.html#module-isaaclab_rl.skrl https://skrl.readthedocs.io/en/latest/intro/getting_started.html 在本节中,您将学习如何使用 skrl 库的各种组件来创建强…...
AI数字人实现原理
随着人工智能与数字技术的快速发展,AI数字人(Digital Human)作为新一代人机交互媒介,正在多个行业中快速落地。无论是在虚拟主播、在线客服、教育培训,还是在数字代言、元宇宙中,AI数字人都扮演着越来越重要…...
RBTree的模拟实现
1:红黑树的概念 红⿊树是⼀棵⼆叉搜索树,他的每个结点增加⼀个存储位来表⽰结点的颜⾊,可以是红⾊或者⿊⾊。通过对任何⼀条从根到叶⼦的路径上各个结点的颜⾊进⾏约束,红⿊树确保没有⼀条路径会⽐其他路径⻓出2倍,因…...
ssh connect to remote gitlab without authority
ssh connect to remote gitlab without authority 1 this command can produce a ssh key for authority ssh-keygen -t ed25519 -C "your_emailexample.com"2 this command can get the comment about the key cat ~/.ssh/id_ed25519.pubcopy all content !!!...