Heavymantory 2023-03-04 10:15 采纳率: 71.4%
浏览 29
已结题

关于#python#的问题,如何解决?

利用python构建知识图谱,报错语法错误,具体信息如下,代码能够运行,但是neo4j中没有出现关系,只出现了节点
具体报错信息如下:

```python
SyntaxError: Invalid input '2': expected whitespace, '.', node labels or rel types, '[', '^', '*', '/', '%', '+', '-', "=~", IN, STARTS, ENDS, CONTAINS, IS, '=', "<>", "!=", '<', '>', "<=", ">=", AND, XOR, OR, USE GRAPH, LOAD CSV, START, MATCH, UNWIND, MERGE, CREATE UNIQUE, CREATE, SET, DELETE, REMOVE, FOREACH, WITH, CALL, RETURN, UNION, ';' or end of input (line 1, column 45 (offset: 44))
"match(p:author),(q:article) where p.name='['2014年', '2014年', '2014年', '2014年', '2014年', '2014年', '2014年', '2014年', '2014年', '2014年']'and q.name='2014年' create (p)-[rel:first_author{name:'第一作者'}]->(q)"

```下面是构建关系的代码
def create_graphrels(self):
author, article, rels_writer = self.read_nodes()
self.create_relationship('author', 'article', rels_writer, 'first_author', '第一作者')

'''创建实体关联边'''

def create_relationship(self, start_node, end_node, edges, rel_type, rel_name):
    count = 0
    # 去重处理
    set_edges = []
    for edge in edges:
        set_edges.append('###'.join(map(str,edge)))
    all = len(set(set_edges))
    for edge in set(set_edges):
        edge = edge.split('###')
        p = edge[0]
        q = edge[1]
        query = "match(p:%s),(q:%s) where p.name='%s'and q.name='%s' create (p)-[rel:%s{name:'%s'}]->(q)" % (
                 start_node, end_node, p, q, rel_type, rel_name)
        try:
            self.g.run(query)
            count += 1
            print(rel_type, count, all)
        except Exception as e:
            print(e)
    return
  • 写回答

3条回答 默认 最新

  • 「已注销」 2023-03-04 10:23
    关注

    “Devil组”引证GPT后的撰写:
    根据报错信息,可以看出问题出现在这行代码中:

    "match(p:author),(q:article) where p.name='['2014', '2014', '2014', '2014', '2014', '2014', '2014', '2014', '2014', '2014']'and q.name='2014年' create (p)-[rel:first_author{name:'第一作者'}]->(q)"
    
    
    

    具体问题在于,字符串中的 p.name 参数值使用了引号包含一个列表,但是这是不正确的语法,应该将引号替换为双引号或不使用引号,具体替换如下:

    query = 'match(p:%s),(q:%s) where p.name=["%s"] and q.name="%s" create (p)-[rel:%s{name:"%s"}]->(q)' % (
             start_node, end_node, p, q, rel_type, rel_name)
    
    
    

    或者使用 Python 的 f-string 格式化字符串:

    query = f'match(p:{start_node}),(q:{end_node}) where p.name=["{p}"] and q.name="{q}" create (p)-[rel:{rel_type}{{name:"{rel_name}"}}]->(q)'
    
    
    

    这应该会解决你的问题

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月4日
  • 已采纳回答 3月4日
  • 创建了问题 3月4日

悬赏问题

  • ¥15 (标签-UDP|关键词-client)
  • ¥15 关于库卡officelite无法与虚拟机通讯的问题
  • ¥15 qgcomp混合物线性模型分析的代码出现错误:Model aliasing occurred
  • ¥100 已有python代码,要求做成可执行程序,程序设计内容不多
  • ¥15 目标检测项目无法读取视频
  • ¥15 GEO datasets中基因芯片数据仅仅提供了normalized signal如何进行差异分析
  • ¥15 小红薯封设备能解决的来
  • ¥100 求采集电商背景音乐的方法
  • ¥15 数学建模竞赛求指导帮助
  • ¥15 STM32控制MAX7219问题求解答