- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试导入lastfm360K数据库导入 Neo4j 数据库。我首先将所有用户插入为节点,使用以下代码没有任何问题
import re
from datetime import datetime
from elasticsearch import Elasticsearch
import certifi
from neo4j.v1 import GraphDatabase, basic_auth
driver = GraphDatabase.driver("bolt://localhost", auth=basic_auth("neo4j", "pass"))
session = driver.session()
with open("/Users/inanc/Documents/Software/lastfm-dataset-360K/usersha1-profile.tsv" , 'r') as userFile:
#first_line = userFile.readline()
linenum = 0
for line in userFile:
linenum = linenum + 1
if linenum % 1000 == 0:
print(linenum)
lineStrip = line.rstrip().split("\t")
tempDict = {}
tempDict["user_id"] = lineStrip[0]
if len(lineStrip) > 1:
tempDict["gender"] = lineStrip[1]
if lineStrip[2] != "":
tempDict["age"] = int(lineStrip[2])
tempDict["country"] = lineStrip[3]
tempDict["signup"] = lineStrip[4]
session.run("CREATE (a:Person {dict})", {"dict": tempDict})
session.close()
然后我想添加艺术家节点以及与用户的关系,如下所示
import re
from datetime import datetime
from elasticsearch import Elasticsearch
import certifi
from neo4j.v1 import GraphDatabase, basic_auth
driver = GraphDatabase.driver("bolt://localhost", auth=basic_auth("neo4j", "pass"))
session = driver.session()
linenum = 0
with open("/Users/inanc/Documents/Software/lastfm-dataset-360K/usersha1-artmbid-artname-plays.tsv" , 'r') as songFile:
for line in songFile:
linenum = linenum + 1
if linenum % 10000 == 0:
print(linenum)
lineStrip = line.rstrip().split("\t")
if len(lineStrip) == 4:
#print(line)
user_id = lineStrip[0]
musicbrainz_artistid = lineStrip[1]
artist_name = lineStrip[2]
plays = 1
if lineStrip[3] != "":
plays = int(lineStrip[3])
session.run("MERGE (a:Artist {artist_name: {artist_name}})", {"artist_name": artist_name})
session.run("MATCH (p:Person {user_id: {user_id}}), (a:Artist {artist_name: {artist_name}}) CREATE (p)-[:LIKES {times: {plays}}]->(a)", {"user_id": user_id, "artist_name": artist_name, "plays": plays})
session.close()
它开始执行时没有任何错误(顺便说一句,它非常慢,花了几个小时),但一段时间后它在某个时刻挂起(例如在几百万行之后)。即使我的 python 脚本挂起,我仍然可以通过浏览器进行查询。
我唯一的限制是
create constraint on (p:Person) assert p.user_id is unique;
create constraint on (a:Artist) assert a.artist_name is unique;
我在配备 8GB 内存的 Macbook 上使用 neo4j 3.0.7。我也在使用官方支持的python driver由 Neo4j 提供。
任何帮助将不胜感激!
最佳答案
每次调用 session.run()
都会执行以下操作:
run()
的 Cypher 语句。就您的情况而言,您实际上在每个输入行进行两次 session.run()
调用。不仅如此,第二次调用中的 Cypher 语句必须与第一次调用中 Cypher 获取的 Artist
节点相匹配。
由于您的输入文件有 1750 万行,这意味着您正在创建/提交/关闭 3500 万笔交易。此外,您还执行了 1750 万次不必要的 MATCH
操作。这是极其昂贵的,并且有时还可能导致驾驶员绊倒。
建议:
您应该在同一事务中批处理多个操作。例如,如果您在每个事务中批处理 10K 操作,则 1750 万个输入行只需要 1750 个事务。
您应该将两个 Cypher 语句合并为一个。
例如,如果您更改代码以便:
,您应该会获得更好的结果:用每批 10K 元素生成一个 list
数组参数,(如果打印得很好的话)如下所示:
{"list":
[
{"id": 1, "name": 'aaa', "plays": 3},
{"id": 2, "name": 'bbb', "plays": 2},
{"id": 3, "name": 'ccc', "plays": 3},
...
{"id": 10000, "name": 'xyz', "plays": 7}
]
}
使用以下 Cypher 语句:
UNWIND {list} AS d
MATCH (p:Person {user_id: d.id})
MERGE (a:Artist {artist_name: d.name})
MERGE (p)-[:LIKES {times: d.plays}]->(a)
使用上述 Cypher 语句和参数调用 session.run()
(每 10K 输入行一次)。
关于python - 使用 python 将数据导入 Neo4j 时挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40514890/
在C语言中,当有变量(假设都是int)i小于j时,我们可以用等式 i^=j^=i^=j 交换两个变量的值。例如,令int i = 3,j = 5;在计算 i^=j^=i^=j 之后,我有 i = 5,
我为以下问题编写了以下代码: 给定一个由 N 个正整数组成的序列 A,编写一个程序来查找满足 i > A[j]A[i](A[i] 的 A[j] 次方 > A[j] 的 A[i] 次方)。 我的代码通过
这个表达式是从左到右解析的吗?我试图解释解析的结果,但最后的结果是错误的。 int j=10, k=10; j+=j-=j*=j; //j=j+(j-=j*=j)=j+(j-j*j) k+=k*=
给定一个整数数组 A ,我试图找出在给定位置 j ,A[j] 从每个 i=0 到 i=j 在 A 中出现了多少次。我设计了一个如下所示的解决方案 map CF[400005]; for(int i=0
你能帮我算法吗: 给定 2 个相同大小的数组 a[]和 b[]具有大于或等于 1 的整数。 查找不相等的索引 i和 j ( i != j ) 使得值 -max(a[i]*b[i] + a[i] * b
每次用J的M.副词,性能显着下降。因为我怀疑艾弗森和许比我聪明得多,我一定是做错了什么。 考虑 Collatz conjecture .这里似乎有各种各样的内存机会,但不管我放在哪里M. ,性能太差了
假设一个包含各种类型的盒装矩阵: matrix =: ('abc';'defgh';23),:('foo';'bar';45) matrix +---+-----+--+|abc|defgh|23|+
是否有可能对于两个正整数 i 和 j,(-i)/j 不等于 -(i/j)?我不知道这是否可能......我认为这将是关于位的东西,或者 char 类型的溢出或其他东西,但我找不到它。有什么想法吗? 最
假设两个不同大小的数组: N0 =: i. 50 N1 =: i. 500 应该有一种方法可以获得唯一的对,只需将两者结合起来即可。我发现的“最简单”是: ]$R =: |:,"2 |: (,.N0)
我是 J 的新用户,我只是想知道 J 包中是否实现了三次样条插值方法? 最佳答案 我自己不熟悉,但是我确实安装了所有的包,所以 $ rg -l -i spline /usr/share/j/9.02
在 Q/kdb 中,您可以使用 ': 轻松修改动词,它代表每个优先级。它会将动词应用于一个元素及其之前的邻居。例如 =': 检查值对是否相等。在 J 中,您可以轻松折叠 /\ 但它是累积的,是否有成对
嗨,我有一个 4x4 双矩阵 A 1+2i 2-1i -3-2i -1+4i 3-1i -3+2i 1-3i -1-3i 4+3i 3+5i 1-2i -1-4i
刚刚发现 J 语言,我输入: 1+^o.*0j1 I expected the answer to be 0 ,但我得到了 0j1.22465e_16。虽然这非常接近于 0,但我想知道为什么 J 应该
这个问题在这里已经有了答案: With arrays, why is it the case that a[5] == 5[a]? (20 个答案) 关闭 3 年前。 我正在阅读“C++ 编程语言”
当第一行是 1, 1/2 , 1/3 ....这是支持该问题的图像。 是否存在比朴素的 O(n^2) 方法更有效的方法? 我在研究伯努利数时遇到了这个问题,然后在研究“Akiyama-Tanigawa
我写了一段Java代码,它在无限循环中运行。 下面是代码: public class TestProgram { public static void main(String[] args){
for (int i = n; i > 0; i /= 2) { for (int j = 0; j 0; i /= 2) 的第一个循环结果 O(log N) . 第二个循环for (int
如问题中所述,需要找到数组中 (i,j) 对的总数,使得 (1) **ia[j]** 其中 i 和 j 是数组的索引。没有空间限制。 我的问题是 1) Is there any approach w
for l in range(1,len(S)-1): for i in range(1,len(S)-l): j=i+l for X in N:
第二个for循环的复杂度是多少?会是n-i吗?根据我的理解,第一个 for 循环将执行 n 次,但第二个 for 循环中的索引设置为 i。 //where n is the number elemen
我是一名优秀的程序员,十分优秀!