我正在开发一个可以很好地处理图形数据库(Titan)的应用程序,除了它有很多边缘的顶点问题,即超节点.
上面的超节点链接指向Titan作者的博客文章,解释了解决问题的方法.解决方案似乎是通过边缘过滤来减少顶点的数量.
Unfortunately I want to groupCount
attributes of edges or vertices. For example I have 1 million users and each user belongs to a country. How can I do a fast groupCount
to work out the number of users in each country?
What I've tried so far can be shown in this elaborate groovy script:
g = TitanFactory.open('titan.properties') // Cassandra
r = new Random(100)
people = 1e6
def newKey(g, name, type) {
return g
.makeType() …
Run Code Online (Sandbox Code Playgroud) 在第6章的O'Reilly书籍"图形数据库"中,它是关于Neo4j如何存储图形数据库的,它说:
要理解为什么本机图处理比基于重索引的图更有效,请考虑以下内容.根据实现,索引查找可以是算法复杂度中的O(log n),而O(1)则用于查找直接关系.为了遍历m个步骤的网络,索引方法的成本(O(m log n))使得使用无索引邻接的实现的O(m)成本相形见绌.
然后解释说Neo4j通过将所有节点和关系存储为固定大小的记录来实现这种恒定时间查找:
对于固定大小的记录和类似指针的记录ID,只需通过追踪数据结构周围的指针即可实现遍历,这可以以非常高的速度执行.为了遍历从一个节点到另一个节点的特定关系,数据库执行几个廉价的ID计算(这些计算比搜索全局索引便宜得多,因为如果在非图形本机数据库中伪造图形,我们必须这样做)
最后一句话触发了我的问题:使用Cassandra或HBase作为存储后端的Titan如何实现这些性能提升或弥补它?
我正在关注我的Windows机器上的http://s3.thinkaurelius.com/docs/titan/1.0.0/getting-started.html指南.
但是我在第一步陷入困境,让gremlin运行:
>bin\gremlin.bat
Error opening zip file or JAR manifest missing : ..\lib\jamm-0.3.0.jar
Error occurred during initialization of VM
agent library failed to init: instrument
Run Code Online (Sandbox Code Playgroud) 我在一台机器上运行带有Spark(1.6.1)的JanusGraph(0.1.0).我完成了这里描述的配置.使用SparkGraphComputer访问gremlin-console上的图形时,它始终为空.我在日志文件中找不到任何错误,它只是一个空图.
是否有人使用JanusGraph与Spark并可以共享他的配置和属性?
使用JanusGraph,我得到了预期的输出:
gremlin> graph=JanusGraphFactory.open('conf/test.properties')
==>standardjanusgraph[cassandrathrift:[127.0.0.1]]
gremlin> g=graph.traversal()
==>graphtraversalsource[standardjanusgraph[cassandrathrift:[127.0.0.1]], standard]
gremlin> g.V().count()
14:26:10 WARN org.janusgraph.graphdb.transaction.StandardJanusGraphTx - Query requires iterating over all vertices [()]. For better performance, use indexes
==>1000001
gremlin>
Run Code Online (Sandbox Code Playgroud)
使用带有Spark作为GraphComputer的HadoopGraph,图形为空:
gremlin> graph=GraphFactory.open('conf/test.properties')
==>hadoopgraph[cassandrainputformat->gryooutputformat]
gremlin> g=graph.traversal().withComputer(SparkGraphComputer)
==>graphtraversalsource[hadoopgraph[cassandrainputformat->gryooutputformat], sparkgraphcomputer]
gremlin> g.V().count()
==>0==============================================> (14 + 1) / 15]
Run Code Online (Sandbox Code Playgroud)
我的conf/test.properties:
#
# Hadoop Graph Configuration
#
gremlin.graph=org.apache.tinkerpop.gremlin.hadoop.structure.HadoopGraph
gremlin.hadoop.graphInputFormat=org.janusgraph.hadoop.formats.cassandra.CassandraInputFormat
gremlin.hadoop.graphOutputFormat=org.apache.tinkerpop.gremlin.hadoop.structure.io.gryo.GryoOutputFormat
gremlin.hadoop.memoryOutputFormat=org.apache.hadoop.mapreduce.lib.output.SequenceFileOutputFormat
gremlin.hadoop.memoryOutputFormat=org.apache.tinkerpop.gremlin.hadoop.structure.io.gryo.GryoOutputFormat
gremlin.hadoop.deriveMemory=false
gremlin.hadoop.jarsInDistributedCache=true
gremlin.hadoop.inputLocation=none
gremlin.hadoop.outputLocation=output
#
# Titan Cassandra InputFormat configuration
#
janusgraphmr.ioformat.conf.storage.backend=cassandrathrift
janusgraphmr.ioformat.conf.storage.hostname=127.0.0.1
janusgraphmr.ioformat.conf.storage.keyspace=janusgraph
storage.backend=cassandrathrift
storage.hostname=127.0.0.1
storage.keyspace=janusgraph
#
# Apache …
Run Code Online (Sandbox Code Playgroud) 任何人都可以提供一些示例代码或提示,如何将1MB CSV节点和另外1MB CSV边缘导入到Cassandra上运行的Titan图数据库中?
我有通过Gremlin导入的小型CSV文件,但这似乎不适合大文件.
我见过Faunus可以做到这一点,但是如果可能的话,我想避免花几天的时间来设置它.
看起来BatchGraph可能是最好的方法(https://github.com/tinkerpop/blueprints/wiki/Batch-Implementation),但示例似乎不完整.
我有一个用例,我必须从一个特定的顶点开始遍历一串顶点.它是一个线性链(像火车),只有一个顶点连接到前一个.虽然遍历我必须根据一些标准发射某些顶点,直到我到达链的末端.
第二个用例是上述用例的扩展,但不是从单个顶点开始的单个链,而是有多个这样的链,同样从单个顶点开始.我必须遍历每个链并检查顶点中的特定属性值.当找到该属性匹配时,我必须发出该顶点,并以第二个链开始,依此类推.
我必须使用Gremlin java API实现这一点.这看起来很简单,但我是gremlin的新手,并且在gremlin java API上没有太多关于互联网的帮助.
到目前为止,我想删除现有索引并按照文档中的步骤进行操作。我现在没有配置单独的索引后端。但是,当我到达必须等待索引状态更改的步骤时,m.awaitGraphIndexStatus
它会永远等待更改并超时并出现以下错误:
GraphIndexStatusReport[success=false, indexName='usernameComposite', targetStatus=DISABLED, notConverged={username=INSTALLED}, converged={}, elapsed=PT1M0.092S]
Run Code Online (Sandbox Code Playgroud)
当我尝试创建一个新的时,也会发生同样的情况。任何想法可能导致这种情况?
我正在使用以下代码片段创建 indizes:
graph.tx().rollback()
mgmt = graph.openManagement()
name = mgmt.getPropertyKey('username')
mgmt.buildIndex('username-composite', Vertex.class).addKey(name).unique().buildCompositeIndex()
mgmt.commit()
mgmt.awaitGraphIndexStatus(graph, 'username-composite').call()
Run Code Online (Sandbox Code Playgroud) 我正在创建一个Titan图(由Dynamodb支持); 我正在使用Titan 1.0.0并运行Gremlin-Server 3(在TinkerPop3上).
我正在尝试将一个顶点添加到我的图表中,并在一行中添加标签和多个属性.我能够添加一个带有标签和单个属性的顶点,并且我可以在创建顶点后为顶点添加多个属性,但似乎我无法一次完成所有操作.
为了测试我在gremlin shell中运行命令,但最终用例是通过REST api与它进行交互(已经正常工作).
作为一个说明,我在每次交易后回滚,所以我有一个清白的板岩.
以下是我发起会话的方式:
gremlin> graph = TitanFactory.open('conf/gremlin-server/dynamodb.properties')
==>standardtitangraph[com.amazon.titan.diskstorage.dynamodb.DynamoDBStoreManager:[127.0.0.1]]
gremlin> g = graph.traversal()
==>graphtraversalsource[standardtitangraph[com.amazon.titan.diskstorage.dynamodb.DynamoDBStoreManager:[127.0.0.1]], standard]
Run Code Online (Sandbox Code Playgroud)
我可以创建一个带有标签和单个属性的顶点,如下所示:
gremlin> graph.addVertex('date_of_birth').property('date_of_birth','1949-01-01')
==>vp[date_of_birth->1949-01-01]
gremlin> g.V().hasLabel('date_of_birth').has('date_of_birth','1949-01-01').valueMap()
==>[date_of_birth:[1949-01-01]]
Run Code Online (Sandbox Code Playgroud)
我也可以创建一个顶点,然后在我刚刚创建的顶点开始遍历遍历许多属性:
gremlin> v1 = graph.addVertex('date_of_birth')
==>v[409608296]
gremlin> g.V(v1).property('date_of_birth','1949-01-01').property('year_of_birth',1949).property('date_of_birth','1949-01-01').property('day_of_birth',1).property('age',67).property('month_of_birth',1)
==>v[409608296]
gremlin> g.V(v1).valueMap()
==>[day_of_birth:[1], date_of_birth:[1949-01-01], month_of_birth:[1], age:[67], year_of_birth:[1949]]
Run Code Online (Sandbox Code Playgroud)
这一切都很好,但我试图避免进行2次调用来实现这个结果,所以我想一次创建具有所有这些属性的顶点.从本质上讲,我希望能够执行以下操作,但失败超过1 .property()
:
gremlin> graph.addVertex('date_of_birth').property('date_of_birth','1949-01-01').property('year_of_birth',1949).property('date_of_birth','1949-01-01').property('day_of_birth',1).property('age',67).property('month_of_birth',1)
No signature of method: com.thinkaurelius.titan.graphdb.relations.SimpleTitanProperty.property() is applicable for argument types: (java.lang.String, java.lang.String) values: [date_of_birth, 1949-01-01]
Run Code Online (Sandbox Code Playgroud)
我也尝试使用.property()
具有多个属性的1 (以及我能想到的所有其他语法变体),但它似乎只捕获第一个:
gremlin> graph.addVertex('date_of_birth').property('date_of_birth','1949-01-01','year_of_birth',1949,'date_of_birth','1949-01-01','day_of_birth',1,'age',67,'month_of_birth',1)
gremlin> g.V().hasLabel('date_of_birth').has('date_of_birth','1949-01-01').valueMap()
==>[date_of_birth:[1949-01-01]]
Run Code Online (Sandbox Code Playgroud)
我查看了所有可以从我找到的所有来源获得的文档,我找不到任何关于"一次性"的方法.有没有人以前做过这个或知道怎么做?
提前致谢!
我有一个带有几个索引的图表.它们是两个具有标签限制的综合指数.(两者在不同的属性/标签上完全相同).一个肯定似乎工作,但另一个没有.我已完成以下配置文件()以加倍检查:
一个叫做KeyOnNode
:属性uid
和标签node
:
gremlin> g.V().hasLabel("node").has("uid", "xxxxxxxx").profile().cap(...)
==>Traversal Metrics
Step Count Traversers Time (ms) % Dur
=============================================================================================================
TitanGraphStep([~label.eq(node), uid.eq(dammit_... 1 1 2.565 96.84
optimization 1.383
backend-query 1 0.231
SideEffectCapStep([~metrics]) 1 1 0.083 3.16
>TOTAL - - 2.648 -
Run Code Online (Sandbox Code Playgroud)
以上是完全可以接受的,效果很好.我假设魔术线是backend-query
.
另一种叫做NameOnSuperNode
:属性name
和标签supernode
:
gremlin> g.V().hasLabel("supernode").has("name", "xxxxxxxx").profile().cap(...)
==>Traversal Metrics
Step Count Traversers Time (ms) % Dur
=============================================================================================================
TitanGraphStep([~label.eq(supernode), name.eq(n... 1 1 5763.163 100.00
optimization 2.261
scan 0.000
SideEffectCapStep([~metrics]) 1 1 0.073 0.00 …
Run Code Online (Sandbox Code Playgroud) 考虑我从 v1 到 v5 大约有 5 个顶点。并且在它们之间有边缘。结构如下。
v1->v2
v1->v3
v4->v2
v2->v1
v2->v3
v3->v5
v5->v1
Run Code Online (Sandbox Code Playgroud)
现在我想编写一个 gremlin 查询来显示出边为 2 的顶点。
例如 v1 有 2 个到 v2 和 v3 的传出边,所以这里的查询应该显示 v1,v2,v3
titan ×10
gremlin ×7
tinkerpop ×3
cassandra ×2
tinkerpop3 ×2
apache-spark ×1
database ×1
groovy ×1
hadoop ×1
janusgraph ×1
java ×1
neo4j ×1