微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Neo4j 中从 csv 加载节点时有条件地创建节点

如何解决在 Neo4j 中从 csv 加载节点时有条件地创建节点

我有一个 csv 格式的数据集。字段之一是“elem_type”。基于这种类型,我需要创建不同类型的节点,并在使用 csv load 加载数据时根据“elem_type”为我的 csv 的“列”提供不同的名称,有什么办法吗?

我的 csv 没有标题,数据如下所示:

    '''
    from typing import Callable
    from mpl_toolkits.mplot3d import Axes3D
    import matplotlib.pyplot as plt
    import numpy as np
    from matplotlib import cm
    import pandas as pd
    import pyodbc
    from notebook.utils import *


    fun = Callable[[float],float]
    data=pd.read_excel('rova_prof.xlsx')
    print (data)

    x = data.iloc[:,:-1].values
    print(x) 
    z = data.iloc[:,-1].values
    print(z)

    def __prepare__(data,x,z,method="linear"): # No keywords in this case
    return member_table()
    x= np.linspace(x[0],x[-1]) 
    z=np.linspace (z[0],z[-1])
    plt.plot(x,clip_on = False)

    plt.show ()

    def solve_inplicit_gen(c: float,f: fun,g: fun,initial: fun,T: float,a: float,b: float,dt: float,dx: float,th:float = 0.5,gen=0):
   ddx = dx * dx
   lam = c * c * dt / ddx
   print(lam)
   J = ((b - a) // dx + 1)
   N = (T // dt + 1)


  zac=np.zeros(J)
  for i in range (0,J):
  zac[i]= initial(a + i * dx)
  print (i)

  U1 = zac
  U2 = np.zeros(J)
  'return U'
  for n in range(1,N):

     for i in range(1,J - 1):
         U2[i] = lam * (U1[i - 1] - 2 * U1[i] + U1[i + 1]) + U1[i]
     U2[0] = f(a)
     U2[-1] = g(b)
     if n % gen == 0:
         yield U1
     U1 = U2
     U2 = np.zeros(J)

    a = z[len(z) // 2]
    b = z[-1]
    print(a,b)
    D = 20e-4
    c = D ** 0.5
    initial = z
    f = lambda x: int(a)
    g = lambda x: int(b)

    dx = (b - a) / 100
    dt = 1 / (2 * c * c) * dx * dx
    #dt = 10
    #ddt = 100
    T = 100*dt


    X = np.arange(a,b + dx,dx)
    if x[-1] > b:
    x = x[:-1]
    Z = np.arange(0,T + dt,dt)
   if z[-1] > T:
   z = z[:-1]

   plt.plot([X],[Z],label="Initial state")
   gy = 1000
   for year,value in enumerate(solve_inplicit_gen (c,f,g,initial,T,a,b,dt,dx,gen=gy)):
                  plt.plot(X,part,label=str(year*gy) + " years")
                  # plt.show()
                  # input()

     leg = plt.legend(loc='lower left',shadow=True,fontsize='x-small')

     leg.get_frame().set_facecolor('#00FFCC')

     plt.title("Profile 1")
     plt.show()
     '''


     '''
     TypeError                                 Traceback (most recent call last)
     <ipython-input-6-3ee8690ef980> in <module>
     24 plt.plot([X],label="Initial state")
     25 gy = 1000
  ---> 26 for year,gen=gy)):
     27                       plt.plot(X,label=str(year*gy) + " years")
     28                       # plt.show()

    <ipython-input-5-2f0af14af86b> in solve_inplicit_gen(c,th,gen)
    18 
    19 
   ---> 20     zac=np.zeros(J)
    21     for i in range (0,J):
    22         zac[i]= initial(a + i * dx)

    TypeError: 'numpy.float64' object cannot be interpreted as an integer
    '''

基于第一列是我的“elem_type”,我想加载数据并定义 3 种类型的节点(人、车、船),并基于 elem_type 定义不同的标题

解决方法

我强烈建议将 csv 文件预解析为每个标签的单独文件。这将使导入的密码变得更加容易。在下面,我通过将 CASE 命令包装在 FOREACH 中使用了一个小技巧:

load csv from "file:///test.csv" as line
foreach (i in case when line[0] = '0' then [1] else [] end | 
  merge (p:Person {id: line[1]}) set p.name = line[2] )
foreach (i in case when line[0] = '1' then [1] else [] end | 
  merge (c:Car {id: line[1]}) set c.name = line[2],c.color = line[4] )
foreach (i in case when line[0] = '2' then [1] else [] end | 
  merge (b:Boat {id: line[1]}) set b.name = line[2] )

另外,不要忘记为要合并的属性添加索引。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。