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 (标签-STM32|关键词-智能小车)
  • ¥20 关于#stm32#的问题,请各位专家解答!
  • ¥15 (标签-python)
  • ¥15 第一个已完成,求第二个做法
  • ¥20 搭建awx,试了很多版本都有错
  • ¥15 java corba的客户端该如何指定使用本地某个固定IP去连接服务端?
  • ¥15 activiti工作流问题,求解答
  • ¥15 有人写过RPA后台管理系统么?
  • ¥15 Bioage计算生物学年龄
  • ¥20 如何将FPGA Alveo U50恢复原来出厂设置哇?