我正在使用Titan Server(Cassandra)v 0.3.1.我想在我已经开始使用的顶点键/属性上创建索引.然而,在他们的文档中,Titan解释说:
要按键索引顶点,必须在首次在顶点属性中使用键之前创建相应的键索引.
如果我尝试在已存在的字段上创建索引,我会看到预期的错误:
gremlin> g.createKeyIndex("my_key",Vertex.class)
Cannot add an index to an already existing property key: my_key
Run Code Online (Sandbox Code Playgroud)
但是,即使我尝试通过删除所有顶点和边缘来清除图形,我也会看到同样的错误:
gremlin> g.E.remove()
==>null
gremlin> g.V.remove()
==>null
gremlin> g.createKeyIndex("my_key",Vertex.class)
Cannot add an index to an already existing property key: my_key
Run Code Online (Sandbox Code Playgroud)
因此,my_key
即使在删除所有图形元素之后,似乎仍然存在于底层数据存储中.这与文档一致(即使元素已被删除,属性已经"首次使用"),但似乎值得一试.
我的下一步将是重新创建一个新的Cassandra数据存储,但我想知道是否有更好的选择.
在已经在Titan中使用的字段上创建索引的最简单方法是什么?
使用Titan w/Cassandra v 0.3.1,我创建了一个顶点键索引,createKeyIndex
如Titan文档中所述.
gremlin> g.createKeyIndex("my_key", Vertex.class)
==>null
Run Code Online (Sandbox Code Playgroud)
我现在在图中有appx 50k节点和186k边缘,我发现使用的查找之间存在显着的性能差异my_key
.此查询大约需要5秒钟才能运行:
gremlin> g.V.has("my_key", "abc")
==>v[12345]
Run Code Online (Sandbox Code Playgroud)
而使用索引ID的时间不到1秒:
gremlin> g.v(12345)
==>v[12345]
Run Code Online (Sandbox Code Playgroud)
my_key
没有一个独特的约束(我不想),但我想知道是什么导致这种性能差异.如何提高非唯一索引顶点键的查找性能?
我知道这次被问了几次,但我没有找到关于Tinkerpop(3.1)的最新版本的任何参考,其中包含许多我们可以在遍历中使用的新的有用函数.
假设我必须找到节点3和节点4之间的最短路径.这种遍历是否有声音?
g.V(3).repeat(out()).until(id().is(4).and().simplePath()).path().limit(1)
Run Code Online (Sandbox Code Playgroud)
这里我假设当我循环执行BFS搜索时(因此,第一个结果是最短路径),因为这似乎就是loop()
函数的情况.
另外,有没有办法在步骤中包含先前绑定的变量(通过使用as
步骤)until
?更确切地说,我试图在遍历期间选择两个节点,然后找到它们之间的最短路径,例如,
g.V().match(
__as('e0').out('Feedbacks').as('e1'),
__as('e0').repeat(out('Meets')).until(<I reach e1>).path().<get_length>.as('len')
).select('e0', 'e1', 'len')
Run Code Online (Sandbox Code Playgroud)
最后,从前面的遍历中可以看出,我不清楚如何获得最短路径的长度.使用类似的东西
g.V(3).repeat(out()).until(id().is(4).and().simplePath()).path().size()
Run Code Online (Sandbox Code Playgroud)
返回结果的大小(返回的行数),而
g.V(3).repeat(out()).until(id().is(4).and().simplePath()).path().by(__size())
Run Code Online (Sandbox Code Playgroud)
返回错误.
这是我正在试验的图表,如果有人想要玩一下.
graph = TinkerGraph.open()
e0 = graph.addVertex(T.id, 0, label, "User", "name", "e0")
e1 = graph.addVertex(T.id, 1, label, "User", "name", "e1")
e2 = graph.addVertex(T.id, 2, label, "User", "name", "e2")
e3 = graph.addVertex(T.id, 3, label, "User", "name", "e3")
e4 = graph.addVertex(T.id, 4, label, "User", "name", "e4")
e0.addEdge("Feedbacks", e2)
e0.addEdge("Meets", e1)
e2.addEdge("Feedbacks", e4)
e2.addEdge("Meets", e4) …
Run Code Online (Sandbox Code Playgroud) 我希望使用Azure Cosmos DB Graph-API快速插入多个顶点.大多数当前的Microsoft示例逐个创建顶点并为每个顶点执行Gremlin查询,如下所示:
IDocumentQuery<dynamic> query = client.CreateGremlinQuery<dynamic>(graph, "g.addV('person').property('id', 'thomas').property('name', 'Thomas').property('age', 44)");
while (query.HasMoreResults)
{
foreach (dynamic result in await query.ExecuteNextAsync()) {
Console.WriteLine($"\t {JsonConvert.SerializeObject(result)}");
}
Console.WriteLine();
}
query = client.CreateGremlinQuery<dynamic>(graph, "g.addV('person').property('id', 'mary').property('name', 'Mary').property('lastName', 'Andersen').property('age', 39)");
while (query.HasMoreResults)
{
foreach (dynamic result in await query.ExecuteNextAsync()) {
Console.WriteLine($"\t {JsonConvert.SerializeObject(result)}");
}
Console.WriteLine();
}
Run Code Online (Sandbox Code Playgroud)
然而,当我想创建几千个顶点和边缘以初始填充图形时,这不太理想,因为这可能需要一些时间.
这是与Microsoft.Azure.Graphs库v0.2.0-preview
如何有效地将多个顶点一次添加到Cosmos DB中,以便稍后使用Graph API语法进行查询?
我有一组用户名(例如['abc','def','ghi']
)要添加到图表中的"用户"标签下.
现在我首先要检查用户名是否已经存在(g.V().hasLabel('user').has('username','def')
),然后仅添加"用户"标签下用户名属性不匹配的用户名.
此外,这可以在单个gremlin查询或groovy脚本中完成吗?
我正在使用titan graph数据库,tinkerpop3和gremlin REST服务器.
在AWS Neptune文档中,它表示它与Apache TinkerPop Gremlin兼容,但它仅涉及在线事务处理(OLTP)类型的图遍历查询.我还没有看到任何关于长期运行的在线分析处理(OLAP)GraphComputer查询.
是否可以对存储在AWS Neptune图数据库服务中的图形执行OLAP查询?
在我学习如何使用Cosmos DB的图形时,我发现了两个Microsoft教程:
虽然我使用相同的查询,但它的执行不同.
使用Gremlin.Net,它立即执行.我经常(我会说70%的时间)得到一个RequestRateTooLargeException
.如果我理解正确,这意味着我一直达到我选择的400RU/s限制.但是,当查询进入低谷时,它的速度是Microsoft.Azure.Graph解决方案的两倍.
实际上,使用Micorosft.Azure.Graph,我必须调用ExecuteNextAsync
一个循环,一次返回一个结果.
所以问题是:
1°)我应该使用哪种方法来获得更好的性能?
2°)我怎么知道我的查询的RU所以我可以微调它?
3°)是否可以提高现有集合的吞吐量?
更新
问题3,我发现在我的数据库的"数据资源管理器"刀片中,我的图表有一个"Scale&Settings",我可以更新吞吐量.
Update2
问题2,我们无法在使用第一种方法(Gremlin.Net)时收取RU,但Microsoft.Graph方法ExecuteNextAsync
返回FeedResponse
带有字段的a RequestCharge
.
我正在尝试将CSV文件加载到JanusGraph中.据我所知,我需要创建我的图形和模式,然后使用BulkLoaderVertexProgram和我自己的自定义groovy脚本来解析我的csv文件.这样做,它似乎工作,因为我可以看到顶点,但不创建边.
我的配置似乎与我在加载CSV文件时可以找到的所有示例几乎相同,但必须有一些我不理解或忘记的内容.
是否可以从CSV文件批量加载边缘?
这是我的设置:
我正在使用默认的bin/janusgraph.sh脚本启动cassandra
我的gremlin命令:
gremlin> :load data/defineNCBIOSchema.groovy
==>true
gremlin> graph = JanusGraphFactory.open('conf/gremlin-server/socket-janusgraph-apr-test.properties')
==>standardjanusgraph[cassandrathrift:[127.0.0.1]]
gremlin> defineNCBIOSchema(graph)
==>null
gremlin> graph.close()
==>null
gremlin> graph = GraphFactory.open('conf/hadoop-graph/apr-test-hadoop-script.properties')
==>hadoopgraph[scriptinputformat->graphsonoutputformat]
gremlin> blvp = BulkLoaderVertexProgram.build().bulkLoader(OneTimeBulkLoader).writeGraph('conf/gremlin-server/socket-janusgraph-apr-test.properties').create(graph)
==>BulkLoaderVertexProgram[bulkLoader=IncrementalBulkLoader, vertexIdProperty=bulkLoader.vertex.id, userSuppliedIds=false, keepOriginalIds=true, batchSize=0]
gremlin> graph.compute(SparkGraphComputer).workers(1).program(blvp).submit().get()
==>result[hadoopgraph[scriptinputformat->graphsonoutputformat],memory[size:0]]
gremlin> graph.close()
==>null
gremlin> graph = GraphFactory.open('conf/hadoop-graph/apr-test-hadoop-load.properties')
==>hadoopgraph[cassandrainputformat->gryooutputformat]
gremlin> g = graph.traversal().withComputer(SparkGraphComputer)
==>graphtraversalsource[hadoopgraph[cassandrainputformat->gryooutputformat], sparkgraphcomputer]
gremlin> g.E() <--- returns nothing
Run Code Online (Sandbox Code Playgroud)
我的JanusGraph:(conf/gremlin-server/socket-janusgraph-apr-test.properties)
gremlin.graph=org.janusgraph.core.JanusGraphFactory
storage.backend=cassandrathrift
storage.hostname=127.0.0.1
cache.db-cache = true
cache.db-cache-clean-wait = 20
cache.db-cache-time = 180000
cache.db-cache-size = 0.25
index.search.backend=elasticsearch
index.search.directory=/tmp/searchindex
index.search.elasticsearch.client-only=false
index.search.elasticsearch.local-mode=true
index.search.hostname=127.0.0.1
Run Code Online (Sandbox Code Playgroud)
我的bulkLoader图:(conf/hadoop-graph/apr-test-hadoop-script.properties)
gremlin.graph=org.apache.tinkerpop.gremlin.hadoop.structure.HadoopGraph …
Run Code Online (Sandbox Code Playgroud) 我的目的是使用存储在列表中的关键字索引包含pdf文件(以及其他文件类型)的任意目录.我有一个传统的解决方案,我听说使用例如SimpleGraph的基于图形的解决方案可以更优雅/高效并且独立于目录结构.
基于图形的解决方案(例如SimpleGraph)会是什么样的?
传统解决方案
// https://stackoverflow.com/a/14051951/1497139
List<File> pdfFiles = this.explorePath(TestPDFFiles.RFC_DIRECTORY, "pdf");
List<PDFFile> pdfs = this.getPdfsFromFileList(pdfFiles);
…
for (PDFFile pdf:pdfs) {
// https://stackoverflow.com/a/9560307/1497139
if (org.apache.commons.lang3.StringUtils.containsIgnoreCase(pdf.getText(), keyWord)) {
foundList.add(pdf.file.getName()); // here we access by structure (early binding)
// - in the graph solution by name (late binding)
}
}
Run Code Online (Sandbox Code Playgroud) gremlin ×10
titan ×3
groovy ×2
tinkerpop3 ×2
graph ×1
hadoop ×1
janusgraph ×1
olap ×1
simplegraph ×1