我正在设置一个 Java Enterprise 1.7 项目,该项目将 TinkerPop 3 和 Titan 0.5 与 Cassandra 一起使用。
一般的想法是:
我有很多悬而未决的问题,我想寻求最佳实践、建议和示例。
这个基本配置最终会放在 github ot bitbucket 中,为其他项目做好准备。
作为容量和性能测试的一部分,我尝试使用 java 线程并行执行多个 gremlin 请求(图形遍历)。它在较少数量的线程中工作得很好。
当我增加线程数(例如 500)时,出现以下错误
线程“Thread-34”中出现异常 java.lang.RuntimeException:java.lang.RuntimeException:java.util.concurrent.TimeoutException:等待可用主机超时。在 org.apache.tinkerpop.gremlin.driver.Client.submit(Client.java:146) 在 com.tests.java.titan.Vertices.exists(Vertices.java:37) 在 com.tests.java.titan.Complex com.tests.java.perfTests.TitanThread.run(ParallelGraphTraversal.java:112) 处的.searchNodesRelatedByRelation(Complex.java:110) 引起:java.lang.RuntimeException: java.util.concurrent.TimeoutException: 等待超时可用的主机。在 org.apache.tinkerpop.gremlin.driver.Client.submitAsync(Client.java:194) 在 org.apache.tinkerpop.gremlin.driver.Client.submitAsync(Client.java:174) 在 org.apache.tinkerpop.gremlin .driver.Client.submit(Client.java:144) ... 3 个以上
我尝试将 threadPoolWorker 的值从 1 增加到 2,将 gremlinPool 从 8 增加到 16(在文件 gremlin-server.yaml 中)。但我没有注意到任何区别。
有人遇到过这个问题吗?您能否告诉我最大同时连接数是否有限制?
我们的环境:CDH 5.7.1、Titan 1.1.0-SNAPSHOT、Solr 4.10.3、HBase 1.2.0、titan-tp3-driver,用于创建与 gremlin 服务器的远程连接并进行查询
我有两个问题:
如何索引这个查询?
g.V(vertexId).repeat(out().hasLabel('location')).emit().tree().next()
Run Code Online (Sandbox Code Playgroud)在 Titan 1.0 文档中,仅给出了在数据已插入时对图进行索引一次的方法。然而,在此处的generate-modern.groovy
文件中
,我们看到索引是在创建顶点之前完成的,这似乎是合理的。然而,当我尝试使用时,我无法做到这一点,因为它让我失望 buildMixedIndex
非法参数异常:未知外部索引后端搜索
我的方法是
def location = mgmt.makeVertexLabel("location").make()
def displayName = mgmt.makePropertyKey("displayName").dataType(String.class).cardinality(Cardinality.SINGLE).make()
def shortName = mgmt.makePropertyKey("shortName").dataType(String.class).cardinality(Cardinality.SINGLE).make()
def description = mgmt.makePropertyKey("description").dataType(String.class).cardinality(Cardinality.SINGLE).make()
def latitude = mgmt.makePropertyKey("latitude").dataType(String.class).cardinality(Cardinality.SINGLE).make()
def longitude = mgmt.makePropertyKey("longitude").dataType(String.class).cardinality(Cardinality.SINGLE).make()
def locationByName = mgmt.buildIndex("displayNameAndShortNameAndDescriptionAndLatitudeAndLongitude", Vertex.class).addKey(displayName).addKey(shortName).addKey(description)
.addKey(latitude).addKey(longitude).indexOnly(location).buildMixedIndex('search')
Run Code Online (Sandbox Code Playgroud)
我哪里理解错了?
在这里,他们将类型设置为每个顶点上的属性.但是,如果我想给类型一些属性呢?在这种情况下,创建一个顶点来表示一个类型并让每个其他顶点都有一个"类型"边缘会不会更有意义?否则我最终会复制一个类型的属性.
如果我想要检索特定类型的所有顶点,这个额外的间接层是否会对性能产生重大影响?
我有一个像这样的递归数据结构:
@Canonical
static class Person {
String name
Set<Person> knows
}
Run Code Online (Sandbox Code Playgroud)
我有一个代表这种结构的Tinkerpop图:
(Jon) -- knows --> (Billy) -- knows --> (Jane) -- ... -->
\- knows --> (Suzy) -- ... -->
Run Code Online (Sandbox Code Playgroud)
将任意深度的Tinkerpop图映射到数据结构的最有效方法是什么?
我可以想象使用PathStep
它,但似乎应该有一个更好的方法,而且我不是很好地看待TP3.
def 'build recursive person object'() {
when:
def g = TinkerGraph.open()
def jon = g.addVertex(T.label, 'person', 'name', 'jon')
def bill = g.addVertex(T.label, 'person', 'name', 'bill')
def jane = g.addVertex(T.label, 'person', 'name', 'jane')
jon.addEdge('knows', bill)
bill.addEdge('knows', jane)
Multimap<String, Person> relationships = HashMultimap.create()
g.V().has('name', 'jon')
.as('a')
.jump('b', …
Run Code Online (Sandbox Code Playgroud) 我正在使用Titan 0.4 + Cassandra。我的用例需要一次插入多个顶点。(aprrox批处理大小一次是100个顶点。)例如:
v01 = g.addVertex(["UC":"B","i":2]); v02 = g.addVertex(["UC":"H","i":1])
v03 = g.addVertex(["LC":"a"]); v04 = g.addVertex(["LC":"a"]);
v05 = g.addVertex(["LC":"d"]); v06 = g.addVertex(["LC":"h"]);
v07 = g.addVertex(["LC":"i"]); v08 = g.addVertex(["LC":"p"]);
Run Code Online (Sandbox Code Playgroud)
是否有任何gremlin命令添加全部Eight vertices in a single request
。(类似 g.addVertices()
??)
我有顶点User1和User2.当User1访问User2配置文件时,添加一个带有count变量的边(即已访问).
当User1再次访问User2配置文件时,如何增加计数变量.
我有一个遍历如下:
g.V().hasLabel("demoUser")
.as("demoUser","socialProfile","followCount","requestCount")
.select("demoUser","socialProfile","followCount","postCount")
.by(__.valueMap())
.by(__.out("socialProfileOf").valueMap())
.by(__.in("followRequest").hasId(currentUserId).count())
.by(__.outE("postAuthorOf").count())
Run Code Online (Sandbox Code Playgroud)
我正在尝试选择用户顶点,它们链接的社交配置文件顶点以及其他一些计数.问题是所有用户可能没有socialProfile
优势.在这种情况下,遍历失败并出现以下错误:
提供的开始不映射到值:v [8280] - > [TitanVertexStep(OUT,[socialProfileOf],vertex),PropertyMapStep(value)]
我确实从gremlin团队找到了这个帖子.我尝试.by()
用a 包装逻辑内部coalesce()
,并且.fold()
在没有运气的情况下将a附加到语句的末尾.
如何使该选择可选?我想选择一个socialProfile
是否存在,但总是选择demoUser
.
我一直试图在Gremlin查询中弄清楚这个if-else。假设gV({0})是下面的组顶点。
var q = "g.V({0}).as('groupName', 'groupId', 'ownerId').inE(eIsAdminOf, eIsMemberOf).as('rel', 'joinDate').outV().hasLabel(userLabel).as('memberId')";
//TODO:var q = "g.V({0}).as('groupName', 'groupId', 'ownerId').inE(eIsAdminOf";
//if .has('mCanList',true).inE(eIsAdminOf, eIsMemberOf)
//if .has('mCanList',false).inE(eIsAdminOf)
//, eIsMemberOf).as('rel', 'joinDate').outV().hasLabel(userLabel).as('memberId')";
Run Code Online (Sandbox Code Playgroud)
我希望.inE(eIsAdminOf, eIsMemberOf)
基于以上评论中的true或false属性值mCanList。
一直尝试无济于事:
var q = "g.V({0}).as('groupName', 'groupId', 'ownerId','mCanList');
q += ".by(values('mCanList').choose(is(true),.inE(eIsAdminOf, eIsMemberOf), .inE(eIsAdminOf))";
q += '.as('rel', 'joinDate').outV().hasLabel(userLabel).as('memberId')”;
Run Code Online (Sandbox Code Playgroud)
我正在使用node.js与gremlin库一起构建gremlin查询。对我而言,最糟糕的选择是构建2个独立的异步查询,这些查询分别基于
if .has('mCanList',true).inE(eIsAdminOf, eIsMemberOf) or
if .has('mCanList',false).inE(eIsAdminOf)
Run Code Online (Sandbox Code Playgroud)
TIA
我使用cassandra 2.1.7支持的Titan 1.0.0作为后端存储.在尝试在gremlin控制台和java程序上执行相同的查询时,我得到了两种不同格式的输出.我正在使用titan-1.0.0-hadoop1提供的gremlin控制台,对于java我正在使用TinkerPop Gremlin 3.0.1-incubating.
Gremlin控制台:
gremlin> g.V().has('msid',within(-2128958273, 2147477890)).as('in').local(outE('hie_child').has('hostid_e',within(153,83)).order().by('hrank',incr).limit(5)).group().by(outV().id()).by(inV().id().fold())
Run Code Online (Sandbox Code Playgroud)
==> [77467688:[1531850904,4742561976,1009049792,1010020408,1053356264],73363640:[2060075072,3698942184,6776295608,7030726848,35401920]]
我得到了预期的输出类型,即 Map<VertexId, List<VertexId>>
但是在java程序中执行相同的查询时,我得到了Map<VertexId, BulkSet>
.的BulkSet
包括计数器指示的时间的特定条目在结果集增加的号码.有人可以告诉我是否有办法在java中获得与gremlin控制台类似的结果.
Java的:
List<Map<Object, Object>> list = g.V().has("msid", P.within(-2128958273,2147477890)).as("in").local(__.outE("hie_child").has("hostid_e", P.within(153,83)).order().by("hrank", Order.incr).limit(5)).group().by(__.outV().id()).by(__.inV().id().fold()).fold().next();
System.out.println(list);
Run Code Online (Sandbox Code Playgroud)
[{77467688 = {1531850904 = 1,4742561976 = 1,1009049792 = 1,1010000408 = 1,1053356264 = 1},73363640 = {2060075072 = 1,3698942184 = 1,6776295608 = 1,7030726848 = 1,35401920 = 1}} ]
titan ×10
gremlin ×9
tinkerpop3 ×3
tinkerpop ×2
architecture ×1
cassandra ×1
graph ×1
jakarta-ee ×1
janusgraph ×1
java ×1