JanusGraph 为 PHP 助力_weixin_33701564的博客-CSDN博客


本站和网页 https://blog.csdn.net/weixin_33701564/article/details/91455936 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

JanusGraph 为 PHP 助力_weixin_33701564的博客-CSDN博客
JanusGraph 为 PHP 助力
weixin_33701564
于 2018-04-03 06:00:06 发布
157
收藏
文章标签:
php
数据库
区块链
原文链接:https://juejin.im/post/5ac31768f265da23766b7970
版权
原文地址:Powering PHP With JanusGraph原文作者:Don Omondi译文出自:掘金翻译计划本文永久链接:github.com/xitu/gold-m…译者:GanymedeNil校对者:allenlongbaobao
JanusGraph 为 PHP 助力
随着 JanusGraph 的日益流行,开发者们也毫无疑问地围绕着它开发着相应的工具。在这篇来自 Compose Write Stuff 的文章中,Campus Discounts 的创始人兼首席技术官 Don Omondi 将谈到他为 JanusGraph 开发新的 PHP 库并且分享如何使用它。
在编程语言的世界中,PHP 并不需要过多介绍。它在 1995 年正式对外发布了 1.0 版本。现在 PHP 已经成为许多独角兽公司的中坚力量,而其中最为人知晓的就是 Facebook,最近像 Slack 也加入了 PHP 的阵营。截至 2017 年 9 月,W3Techs 报告称,在所有已知网站中,服务端编程语言使用了 PHP 的占了 82.8% !
在数据库的世界中,JanusGraph 虽是一位新成员,但它却有着深厚的技术底蕴,因为它建立在开源图形数据库的前任领导者 Titan 的基础上。为了提供给您一些关于图数据库的背景知识,请看图数据库简介。虽然 JanusGraph 还很年轻,但是它已经被一个知名的独角兽公司 —— Uber 使用。
所以最大的问题是,如何使用 PHP 和 JanusGraph 创建一家独角兽公司?相信我,我也希望我知道答案!但是,如果问题是如何使用 JanusGraph 来强化 PHP ?我倒是知道不止一种方法。
Gremlin-OGM PHP 库介绍
Gremlin-OGM PHP 库是 Tinkerpop 3+ 兼容的图形数据库(JanusGraph,Neo4j 等)的对象图形映射器,允许您保存数据并运行 gremlin 查询。
该库已经托管在 Packagist 上了 ,所以可以轻松的使用 Composer 安装。
composer require the-don-himself/gremlin-ogm
复制代码
使用该库也很容易,因为它有大量的 PHP 注释。但是在我们开始使用它之前,让我们深入探讨一下使用像 JanusGraph 这样的图形数据库时可能遇到的一些问题以及该库如何帮助您避免它们。
注意事项
首先,具有相同名称的所有属性必须具有相同的数据类型。如果您已经在不同的数据库中有数据,比如 MySQL 或者 MongoDB ,那么您可能会遇到这种情况。
一个很好的例子就是在每个实体类或文档中称为 id 的字段。一些 ID 可能是一个整数的数据类型(1、2、3 等), 其他一些可能是字符串类型 (例如在常见问题解答库中的 ID en_1、es_1、fr_1),另外还有比如 MongoDB 的 UUID(例子 59be8696540bbb198c0065c4)。对于这些不同的数据类型使用相同属性名称的情况会引发异常。Gremlin-OGM 库会发现这样的冲突并拒绝执行。作为一种解决方法,我建议将标签与单词 id 组合; 例如,用户的标识符变为 users_id 。该库附带一个序列化程序,允许您将字段映射到虚拟属性以避免此冲突。
其次,属性(property)名称,边缘(edge)标签和顶点(vertex)标签在图中必须都是唯一的。例如,将 Vertex 标记为 tweets 并引用一个对象,然后创建一个 Edge 标记为 tweets 并引用用户操作,或者在 users Vertex 中创建一个 property tweets 来引用用户发出的推文数量。该库同样会发现这种冲突并拒绝执行。
第三,对于性能和模式的有效性,我建议确保每个元素,或者至少每个顶点包含一个唯一的属性,在该唯一属性上将创建唯一的组合索引(也称为键索引)。这确保所有元素都是唯一的,并且会提高性能,因为在顶点之间添加边缘首先需要查询它们是否先存在。该库允许您为此目的使用 @Id 注释标记属性。
最后,索引。这一点值得写一本或两本书。在 JanusGraph 中,基本上您索引的是属性(毕竟它是一个属性图),但是可以在不同的顶点和边缘上使用相同的属性名称。这样做时要非常小心。请记住第一件要注意的事情。因此,例如在默认情况下,属性 total_comments 上的索引将跨越所有顶点和边缘。查询其中total_comments 大于 5 的顶点会返回 total_comments > 5 的 users ,total_comments > 5 的博客帖子以及满足该查询的任何其他顶点的混合情况。更糟糕的情况是,一段时间后,如果您在 recipes 顶点了加一个 total_comments 属性,那么你现有的查询就会出错了。
为了防止上述潜在的问题,JanusGraph 允许您在创建索引时设置标签参数以限制其范围。我建议这样做以保持索引更小和更高性能,但这意味着您必须为每个索引提供一个唯一的名称。Gremlin-OGM 库查找任何冲突的索引名称,如果发现将拒绝执行。
如何使用 Gremlin-OGM
要开始使用 Gremlin-OGM ,我们首先需要在我们的源文件夹中创建一个名为 Graph 的目录,例如 src/Graph。在这个目录下,我们需要创建两个不同的目录:一个叫做 Vertices ,另一个叫做 Edges 。这两个目录现在将包含定义我们图表元素的PHP类。
顶点文件夹中的每个类主要使用注释描述顶点标签,关联索引和属性。对于更高级的用例,如果您使用 MongoDB 并拥有一个保存嵌入式文档的类(例如注释集合),则还可以定义最适合的嵌入边缘。
边缘文件夹中的每个类还是通过注释描述边缘标签,相关索引和属性。每个边缘类中的两个属性也可以使用注释进行标记,一个用于描述顶点从哪链接过来的,另一个用于描述顶点要链接去哪。它的使用真的很简单,但我们还是用一个实例来说明吧。
一个实际的例子:推特
Twitter和图形数据库真的是天生一对。像用户和推文这样的对象可以形成顶点,而诸如 follow ,likes ,tweeted 和 retweets 等操作可以形成边缘。请注意,边缘 tweeted 是以这种方式命名的,以避免与顶点 tweets 发生冲突。这个简单的模型的图形表示可以如下图所示。
让我们在 Graph/Vertexes 文件夹和 Graph/Edges 文件夹中创建相应的类。tweets 类可能如下所示:
<?php
namespace TheDonHimself\GremlinOGM\TwitterGraph\Graph\Vertices;
use JMS\Serializer\Annotation as Serializer;
use TheDonHimself\GremlinOGM\Annotation as Graph;
/**
* @Serializer\ExclusionPolicy("all")
* @Graph\Vertex(
* label="tweets",
* indexes={
* @Graph\Index(
* name="byTweetsIdComposite",
* type="Composite",
* unique=true,
* label_constraint=true,
* keys={
* "tweets_id"
* }
* ),
* @Graph\Index(
* name="tweetsMixed",
* type="Mixed",
* label_constraint=true,
* keys={
* "tweets_id" : "DEFAULT",
* "text" : "TEXT",
* "retweet_count" : "DEFAULT",
* "created_at" : "DEFAULT",
* "favorited" : "DEFAULT",
* "retweeted" : "DEFAULT",
* "source" : "STRING"
* }
* )
* }
* )
*/
class Tweets
/**
* @Serializer\Type("integer")
* @Serializer\Expose
* @Serializer\Groups({"Default"})
*/
public $id;
/**
* @Serializer\VirtualProperty
* @Serializer\Expose
* @Serializer\Type("integer")
* @Serializer\Groups({"Graph"})
* @Serializer\SerializedName("tweets_id")
* @Graph\Id
* @Graph\PropertyName("tweets_id")
* @Graph\PropertyType("Long")
* @Graph\PropertyCardinality("SINGLE")
*/
public function getVirtualId()
return self::getId();
/**
* @Serializer\Type("string")
* @Serializer\Expose
* @Serializer\Groups({"Default", "Graph"})
* @Graph\PropertyName("text")
* @Graph\PropertyType("String")
* @Graph\PropertyCardinality("SINGLE")
*/
public $text;
/**
* @Serializer\Type("integer")
* @Serializer\Expose
* @Serializer\Groups({"Default", "Graph"})
* @Graph\PropertyName("retweet_count")
* @Graph\PropertyType("Integer")
* @Graph\PropertyCardinality("SINGLE")
*/
public $retweet_count;
/**
* @Serializer\Type("boolean")
* @Serializer\Expose
* @Serializer\Groups({"Default", "Graph"})
* @Graph\PropertyName("favorited")
* @Graph\PropertyType("Boolean")
* @Graph\PropertyCardinality("SINGLE")
*/
public $favorited;
/**
* @Serializer\Type("boolean")
* @Serializer\Expose
* @Serializer\Groups({"Default", "Graph"})
* @Graph\PropertyName("retweeted")
* @Graph\PropertyType("Boolean")
* @Graph\PropertyCardinality("SINGLE")
*/
public $retweeted;
/**
* @Serializer\Type("DateTime<'', '', 'D M d H:i:s P Y'>")
* @Serializer\Expose
* @Serializer\Groups({"Default", "Graph"})
* @Graph\PropertyName("created_at")
* @Graph\PropertyType("Date")
* @Graph\PropertyCardinality("SINGLE")
*/
public $created_at;
/**
* @Serializer\Type("string")
* @Serializer\Expose
* @Serializer\Groups({"Default", "Graph"})
* @Graph\PropertyName("source")
* @Graph\PropertyType("String")
* @Graph\PropertyCardinality("SINGLE")
*/
public $source;
/**
* @Serializer\Type("TheDonHimself\GremlinOGM\TwitterGraph\Graph\Vertices\Users")
* @Serializer\Expose
* @Serializer\Groups({"Default"})
*/
public $user;
/**
* @Serializer\Type("TheDonHimself\GremlinOGM\TwitterGraph\Graph\Vertices\Tweets")
* @Serializer\Expose
* @Serializer\Groups({"Default"})
*/
public $retweeted_status;
/**
* Get id.
* @return int
*/
public function getId()
return $this->id;
复制代码
Twitter API 非常具有表现力,尽管我们实际上可以保存比顶点类允许的多得多的数据。但是,对于这个示例,我们只是对几个属性感兴趣。上述注释将告诉序列化程序仅在将 Twitter API 数据反序列化为顶点类对象时填充这些字段。
为 users 顶点创建一个类似的类。完整的示例代码位于库中的 TwitterGraph 文件夹中。
在 Graph/Edges 文件夹中可以创建一个示例 Follows 边缘类,它看起来像这样:
<?php
namespace TheDonHimself\GremlinOGM\TwitterGraph\Graph\Edges;
use JMS\Serializer\Annotation as Serializer;
use TheDonHimself\GremlinOGM\Annotation as Graph;
/**
* @Serializer\ExclusionPolicy("all")
* @Graph\Edge(
* label="follows",
* multiplicity="MULTI"
* )
*/
class Follows
/**
* @Graph\AddEdgeFromVertex(
* targetVertex="users",
* uniquePropertyKey="users_id",
* methodsForKeyValue={"getUserVertex1Id"}
* )
*/
protected $userVertex1Id;
/**
* @Graph\AddEdgeToVertex(
* targetVertex="users",
* uniquePropertyKey="users_id",
* methodsForKeyValue={"getUserVertex2Id"}
* )
*/
protected $userVertex2Id;
public function __construct($user1_vertex_id, $user2_vertex_id)
$this->userVertex1Id = $user1_vertex_id;
$this->userVertex2Id = $user2_vertex_id;
/**
* Get User 1 Vertex ID.
* @return int
*/
public function getUserVertex1Id()
return $this->userVertex1Id;
/**
* Get User 2 Vertex ID.
* @return int
*/
public function getUserVertex2Id()
return $this->userVertex2Id;
复制代码
为 likes,tweeted 和 retweets 边缘创建类似的类。完成后,我们可以通过运行以下命令来检查模型的有效性:
php bin/graph twittergraph:schema:check
复制代码
如果抛出异常,那么我们需要先解决它们;否则,我们的模型已经设置好了,现在我们需要做的就是告诉 JanusGraph 。
JanusGraph 连接
TheDonHimself\GremlinOGM\GraphConnection 类负责初始化图形连接。您可以通过创建一个新的实例并在数组中传递一些连接选项来实现。
$options = [
'host' => 127.0.0.1,
'port' => 8182,
'username' => null,
'password' => null,
'ssl' = [
'ssl_verify_peer' => false,
'ssl_verify_peer_name' => false
],
'graph' => 'graph',
'timeout' => 10,
'emptySet' => true,
'retryAttempts' => 3,
'vendor' = [
'name' => _self',
'database' => 'janusgraph',
'version' => '0.2'
],
'twitter' => [
'consumer_key' => 'LnUQzlkWlNT4oNUh7a2rwFtwe',
'consumer_secret' => 'WCIu0YhaOUBPq11lj8psxZYobCjXpYXHxXA6rVcqbuNDYXEoP0',
'access_token' => '622225192-upvfXMpeb9a3FMhuid6oBiCRsiAokpNFgbVeeRxl',
'access_token_secret' => '9M5MnJOns2AFeZbdTeSk3R81ZVjltJCXKtxUav1MgsN7Z'
];
复制代码
vendor 数组可以指定 vendor-specific 信息,如 gremlin 兼容的数据库、版本、服务主机名称(或 _self 本机)以及图的名称。
最终创建模型,我们将运行此命令。
php bin/graph twittergraph:schema:create
复制代码
这个命令将要求一个可选的 configPath 参数,该参数是建立连接时包含 options 数组的 yaml 配置文件的位置。该库在根文件夹中有三个示例配置,janusgraph.yaml,janusgraphcompose.yaml 和 azure-cosmosdb.yaml。
上述命令将递归遍历我们的 TwitterGraph/Graph 目录并查找所有 @Graph 注释来构建模型定义。如果发现异常将被抛出;否则,它将启动一个 Graph 事务来一次提交所有属性、边缘和顶点,或者在失败时回滚。
同样的命令也会询问您是否要执行 dry run。如果指定,则不会将命令发送到 gremlin 服务器,而是将其转储到您可以检查的 command.groovy 文件中。对于Twitter示例,这 26 行是根据您的配置发送或转储的命令(如janusgraph _self 本机)。
mgmt = graph.openManagement()
text = mgmt.makePropertyKey('text').dataType(String.class).cardinality(Cardinality.SINGLE).make()
retweet_count = mgmt.makePropertyKey('retweet_count').dataType(Integer.class).cardinality(Cardinality.SINGLE).make()
retweeted = mgmt.makePropertyKey('retweeted').dataType(Boolean.class).cardinality(Cardinality.SINGLE).make()
created_at = mgmt.makePropertyKey('created_at').dataType(Date.class).cardinality(Cardinality.SINGLE).make()
source = mgmt.makePropertyKey('source').dataType(String.class).cardinality(Cardinality.SINGLE).make()
tweets_id = mgmt.makePropertyKey('tweets_id').dataType(Long.class).cardinality(Cardinality.SINGLE).make()
name = mgmt.makePropertyKey('name').dataType(String.class).cardinality(Cardinality.SINGLE).make()
screen_name = mgmt.makePropertyKey('screen_name').dataType(String.class).cardinality(Cardinality.SINGLE).make()
description = mgmt.makePropertyKey('description').dataType(String.class).cardinality(Cardinality.SINGLE).make()
followers_count = mgmt.makePropertyKey('followers_count').dataType(Integer.class).cardinality(Cardinality.SINGLE).make()
verified = mgmt.makePropertyKey('verified').dataType(Boolean.class).cardinality(Cardinality.SINGLE).make()
lang = mgmt.makePropertyKey('lang').dataType(String.class).cardinality(Cardinality.SINGLE).make()
users_id = mgmt.makePropertyKey('users_id').dataType(Long.class).cardinality(Cardinality.SINGLE).make()
tweets = mgmt.makeVertexLabel('tweets').make()
users = mgmt.makeVertexLabel('users').make()
follows = mgmt.makeEdgeLabel('follows').multiplicity(MULTI).make()
likes = mgmt.makeEdgeLabel('likes').multiplicity(MULTI).make()
retweets = mgmt.makeEdgeLabel('retweets').multiplicity(MULTI).make()
tweeted = mgmt.makeEdgeLabel('tweeted').multiplicity(ONE2MANY).make()
mgmt.buildIndex('byTweetsIdComposite', Vertex.class).addKey(tweets_id).unique().indexOnly(tweets).buildCompositeIndex()
mgmt.buildIndex('tweetsMixed',Vertex.class).addKey(tweets_id).addKey(text,Mapping.TEXT.asParameter()).addKey(retweet_count).addKey(created_at).addKey(retweeted).addKey(source,Mapping.STRING.asParameter()).indexOnly(tweets).buildMixedIndex("search")
mgmt.buildIndex('byUsersIdComposite',Vertex.class).addKey(users_id).unique().indexOnly(users).buildCompositeIndex()
mgmt.buildIndex('byScreenNameComposite',Vertex.class).addKey(screen_name).unique().indexOnly(users).buildCompositeIndex()
mgmt.buildIndex('usersMixed',Vertex.class).addKey(users_id).addKey(name,Mapping.TEXTSTRING.asParameter()).addKey(screen_name,Mapping.STRING.asParameter()).addKey(description,Mapping.TEXT.asParameter()).addKey(followers_count).addKey(created_at).addKey(verified).addKey(lang,Mapping.STRING.asParameter()).indexOnly(users).buildMixedIndex("search")
mgmt.commit()
复制代码
现在我们有了一个有效的模型设置,我们需要的只是数据。Twitter API 有很好的文档关于如何请求这些数据。Gremlin-OGM 库附带了一个 twitteroauth 包 (abraham/twitteroauth) 以及一个准备好的只读 Twitter 应用程序,用于测试该库并帮助您开始使用。
从 API 中获取数据后,保持顶点非常简单。首先,将 JSON 反序列化为相应的顶点类对象。因此,例如,@TwitterDev 通过取回的 Twitter 数据 /api/users/show 将被反序列化,如图所示 var_dump() 。
object(TheDonHimself\GremlinOGM\TwitterGraph\Graph\Vertices\Users)#432 (8) {
["id"]=>
int(2244994945)
["name"]=>
string(10) "TwitterDev"
["screen_name"]=>
string(10) "TwitterDev"
["description"]=>
string(136) "Developer and Platform Relations @Twitter. We are developer advocates. We can't answer
all your questions, but we listen to all of them!"
["followers_count"]=>
int(429831)
["created_at"]=>
object(DateTime)#445 (3) {
["date"]=>
string(26) "2013-12-14 04:35:55.000000"
["timezone_type"]=>
int(1)
["timezone"]=>
string(6) "+00:00"
["verified"]=>
bool(true)
["lang"]=>
string(2) "en"
复制代码
序列化的 PHP 对象现在已经开始在各自的顶点和边缘中形成。但是,我们只能将 gremlin 命令作为字符串发送,所以我们仍然需要将对象序列化为命令字符串。我们将使用一个方便命名的类GraphSerializer 来执行此操作。将反序列化的对象传递给GraphSerializer 的一个实例,该实例将处理复杂的序列化,如剥离新行,添加斜杠,将PHP DateTime 转换为 JanusGraph 所期望的格式。GraphSerializer 也优雅地处理 Geopoint 和 Geoshape 序列化。
// Get Default Serializer
$serializer = SerializerBuilder::create()->build();
// Get Twitter User
$decoded_user = $connection->get(
'users/show',
array(
'screen_name' => $twitter_handle,
'include_entities' => false,
);
if (404 == $connection->getLastHttpCode()) {
$output->writeln('Twitter User @'.$twitter_handle.' Does Not Exist');
return;
// Use default serializer to convert array from Twitter API to Users Class Object handling complex
deserialization like Date Time
$user = $serializer->fromArray($decoded_user, Users::class);
// Initiate Special Graph Serializer
$graph_serializer = new GraphSerializer();
// Use graph serializer to convert Users Class Object to array handling complex deserialization like
Geoshape
$user_array = $graph_serializer->toArray($user);
// Use graph serializer to convert array to a gremlin command string ready to be sent over
$command = $graph_serializer->toVertex($user_array);
复制代码
GraphSerializer 输出将串入 Gremlin 的命令。这个字符串就准备好发送到 JanusGraph 服务器。所以在上面的例子中,它变成:
"g.addV(label, 'users', 'users_id', 2244994945, 'name', 'TwitterDev', 'screen_name', 'TwitterDev', 'description', 'Developer and Platform Relations @Twitter. We are developer advocates. We can\'t answer all your questions, but we listen to all of them!', 'followers_count', 429831, 'created_at', 1386995755000, 'verified', true, 'lang', 'en')"
复制代码
保存边缘要稍微简单一点,因为它的前提是定点存在。因此,库需要知道属性键值对来查找它们。此外,边缘在图数据库中具有方向和多重性。因此,边缘要添加到顶点这非常重要。
这是 Edge 类中 @Graph\AddEdgeFromVertex 和 @Graph\AddEdgeToVertex 属性注释的用途。它们都扩展了 @Graph\AddEdge 注解来指示目标顶点类以及属性键和获取该值所需的方法数组。
假设我们已经在 Twitter API 中查询到了 tweets ,其中包含一个名为 user 的嵌入字段,用于保存 tweeter 数据。如果 users_id:5 创建了 tweets_id:7 ,则序列化的 gremlin 命令将如下所示:
if (g.V().hasLabel('users').has('users_id',5).hasNext() == true
&& g.V().hasLabel('tweets').has('tweets_id',7).hasNext() == true)
g.V().hasLabel('users').has('users_id',5).next().addEdge('tweeted',
g.V().hasLabel('tweets').has('tweets_id',7).next())
复制代码
因此,两个顶点查询是一个事务,然后在users 与 tweets 之间创建两条边缘。请注意,因为一个用户可以多次发 tweet ,但每个 tweet 只能有一个拥有者,所以其重复性为 ONE2MANY。
如果边缘类具有像 tweeted_on 或 tweeted_from 这样的属性,那么库就会像顶点一样适当地序列化它们。
JanusGraph 查询
我们处理了抓取和保存的数据。数据查询也是库帮助完成的。TheDonHimself\Traversal\TraversalBuilder 类提供了几乎与 gremlin 完美匹配的本地API。例如,在 TwitterGraph 中获取用户可以实现如下。
$user_id = 12345;
$traversalBuilder = new TraversalBuilder();
$command = $traversalBuilder
->g()
->V()
->hasLabel("'users'")
->has("'users_id'", "$user_id")
->getTraversal();
复制代码
获取用户时间线这样稍微复杂的例子可以通过以下方式实现。
$command = $traversalBuilder
->g()
->V()
->hasLabel("'users'")
->has("'screen_name'", "'$screen_name'")
->union(
(new TraversalBuilder())->out("'tweeted'")->getTraversal(),
(new TraversalBuilder())->out("'follows'")->out("'tweeted'")->getTraversal()
->order()
->by("'created_at'", 'decr')
->limit(10)
->getTraversal();
复制代码
详细步骤可以在 \TheDonHimself\Traversal\Step 类中找到.
GraphQL 到 Gremlin
有一个独立的尝试 来创建一种支持 GraphQL to Gremlin 命令的标准。它处于早期阶段,只支持查询而不支持变更。既然它也是我写的,Gremlin-OGM 库当然也支持这个标准,希望随着时间的推移会有所改进。
JanusGraph 可视化
可悲的是,它没有像关系数据库,文档数据库和键值数据库那样多的 Graph Database GUI。其中Gephi,可用于通过流式插件来可视化 JanusGraph 数据和查询。与此同时,撰写有 JanusGraph 的数据浏览器,可以使用它来显示 TwitterGraph 的一些查询。
将我关注的 5 位用户可视化
def graph = ConfiguredGraphFactory.open("twitter");
def g = graph.traversal();
g.V().hasLabel('users').has('screen_name',
textRegex('(i)the_don_himself')).outE('follows').limit(5).inV().path()
复制代码
可视化 5 位关注我的用户
def graph = ConfiguredGraphFactory.open("twitter");
def g = graph.traversal();
g.V().hasLabel('users').has('screen_name',
textRegex('(i)the_don_himself')).inE('follows').limit(5).outV().path()
复制代码
可视化我喜欢的 5 条推文
def graph = ConfiguredGraphFactory.open("twitter");
def g = graph.traversal();
g.V().hasLabel('users').has('screen_name',
textRegex('(?i)the_don_himself')).outE('likes').limit(5).inV().path()
复制代码
可视化任意 5 条转推以及原推
def graph = ConfiguredGraphFactory.open("twitter");
def g = graph.traversal();
g.V().hasLabel('tweets').outE('retweets').inV().limit(5).path()
复制代码
现在您拥有了它。一个功能强大、考虑周到、操作简单的库,它可帮助您在几分钟内开始使用 PHP 操作 JanusGraph 。如果您使用了令人惊叹的 Symfony 框架,那么您的运气会更好。即将发行的软件包 Gremlin-OGM-Bundle 将帮助您将数据从 RDBMS 或 MongoDB 复制到 Tinkerpop 3+ 兼容图形数据库中。请享用!
掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 Android、iOS、前端、后端、区块链、产品、设计、人工智能等领域,想要查看更多优质译文请持续关注 掘金翻译计划、官方微博、知乎专栏。
转载于:https://juejin.im/post/5ac31768f265da23766b7970
weixin_33701564
关注
关注
点赞
收藏
评论
JanusGraph 为 PHP 助力
原文地址:Powering PHP With JanusGraph原文作者:Don Omondi译文出自:掘金翻译计划本文永久链接:github.com/xitu/gold-m…译者:GanymedeNil校对者:allenlongbaobaoJanusGraph 为 PHP 助力随着 JanusGraph 的日益流行,开发者们也毫无疑问地围绕着它开发着相应的工具。在这篇来自...
复制链接
扫一扫
好友助力 4.2.0 助力吸粉模块 结合卡券 排行榜等
01-18
功能介绍:1、自定义首页、个人助力页面、好友助力页面的背景和颜色等;2、支持自定义活动主题和助力关键词,想助力霸王餐或是助力景区门票,或是助力iPhone6手机,完全自定义的;3、支持后台设置秒显广告,广告支持设置显示时间和广告链接;4、后台可以开启是否助力赠送卡券功能,卡券支持设置数量和概率,概率越高被领取的机会越大;5、可以设置每天赠送多少次自己赚体力的机会;6、 支持开启是否需要填写粉丝信息等,支持输入手机、昵称、地址等;7、卡券支持设置适用的活动规则;8、后台可以开启是否强制关注功能,支持自定义关注引导链接,邀请好友数量限制等等。9、 后台可以设置帮助力是否需要关注才行。10、支持设置虚拟参与人数量、浏览数等;11、可以设置自己赚体力的随机区间,也可以设置好友助力赠送体力的随机区间12、支持设置达到多少体力,才能获得奖品。13、本模块只支持认证服务号使用,其他非认证服务号的可以借用权限(借用权限的账号无法使用卡券功能);修复可能存在违反微信规则的问题分享后打开在分享页面无法获取用户信息的情况。
解压该下载的模块后,将haoman_fudan文件夹上传至 addons 文件夹下,后台找到模块列表——安装新插件——将该插件安装即可
JanusGraph 自定义 Serializer
最新发布
weixin_40455124的博客
11-08
32
JanusGraph 自定义 Serializer 可以参考atlas的例子,注意以下几点。
参与评论
您还未登录,请先
登录
后发表或查看评论
JanusGraph·server端配置启动和远程remote连接·多实例问题
专注交流
08-06
7551
4.2.2. JanusGraph Server
JanusGraph本身就是一组没有执行线程的jar文件。连接和使用JanusGraph数据库有两种基本模式:
1.嵌入式
补充自己的实验记录
2.当JanusGraph被启动时,JanusGraph打包了一个长期运行的服务器进程(JanusGraph Server),这个服务器进程允许远程客户端进行Janus...
AgensGraph图库Linux安装及界面展示
wangdonghello的专栏
07-25
3279
现在项目用的图库是neo4j,但是社区版的neo4j节点是有限的,企业版的不是免费的,就去研究了一下免费版的agensgraph,有感于agensgraph资料有限,又都是英文文档,所以就分享一下安装过程,用的资料如下:
agensgraph 官网 https://bitnine.net/
安装需要的Linux系统下的包和agensBrower界面化包都可以在官网找到,还有开...
php源码搭建(一)点赞关注和助力砍价平台(源码免费)
guijianchouxyz的博客
01-16
1002
抖音快手点赞、评论和关注以及拼多多砍价,投票等悬赏任务类源码平台搭建
一、 源码搭建完成效果图
下面的图片皆在手机app上面截取,源码搭建完成后支持封装app
二、 源码搭建需要准备
服务器
目前搭建服务器是centos7.5系统,可以购买阿里云服务器。服务器最好买中国香港的,这样域名暂时可以免备案进行学习源码搭建
如果需要封装成app,(安卓的是apk,苹果的是ios),最好要有一个属于自己的域名
第一、使用域名封装后,如果后期服务器ip地址有变化,可以变化域名与ip的解析调整,不需要重新
【JanusGraph】第七章:JanusGraph服务
都是浮云
08-21
4227
第七章:JanusGraph服务
Chapter 7. JanusGraph Server
JanusGraph使用Gremlin Server作为服务组件对客户端请求进行请求处理响应。当JanusGraph打包的时候,Gremlin Server就被称为JanusGraph服务。
JanusGraph使用前必须手动启动,JanusGraph服务提供了一种在一个或多个JanusGra...
janusgraph开发难点总结
muyefeiyang的博客
02-02
1406
前言: 本文为项目开发过程中,研究加实战了半个月的踩坑记录,只记了重要的部分,建议有一定基础的童鞋阅读。
时隔半年,发出来分享下,因为是从word中直接粘贴出来的,排版有瑕疵,望见谅。
目录
一.Jansgraphserver 命令行访问的两种方式:
二.subgraph子图查询失败的问题
三.查询不走索引的问题
四.判重无效导致顶点、边重复插入
五.判断顶点是否重复的语法
六.配置官方权威解读
七.两点可达路径查询语法
八.将字段配置为时间,并按时间查询
九.根据时间排序,及..
百亿级图数据JanusGraph迁移之旅
大数据星球-浪尖
10-04
471
1. 迁移背景介绍目前我们的图数据库数据量为 顶点 20 亿,边 200 亿的规模。在迁移之前我们使用的 AgensGraph 数据库一个主库四个备库,机器的配置都比较高,256G 内存...
即将开学,为校园网络安全助力
热门推荐
小虚竹的专栏
08-24
3万+
校园网络安全助力
TigerGraph:实时图数据库助力金融风控升级
科技星象
05-09
1982
作者:李晨、TigerGraph高级解决方案经理
随着互联网金融的发展,传统金融机构一边享受着金融科技带来的效率提升和服务边界的扩大,另一边黑产的攻击手段也在不断升级,金融机构遭遇的欺诈情况越来越复杂,基于知识图谱的关联反欺诈也应运而生。
风控就是攻守双方技术的进化史
随着互联网金融的发展,传统金融机构一边享受着金融科技带来的效率提升和服务边界的扩大,另一边随着科技的发展,“黑产”也从盗...
一个链接泄露这么多隐私,你还敢拼多多助力吗?
叁滴水 的博客
07-06
6055
目前拼多多助力已经是一个非常普遍的事请了,每隔一段时间拼多多会有一些非常优惠的助力活动,但是在商业竞争下的种种问题,导致拼多多助力传播的过程异常艰难,常有通过链接的方式进行助力。但是,肯定每个人都有一个这样的概念,就是"陌生人分享的链接不要点"。这样也就隐含了"熟人的链接,是可以点击的"。这也就正中骗子的下怀。也就是说,正在跟你聊天的人,可能并不是你的熟人。或者他认为的这个助力链接已经被人替换为钓鱼链接。
图数据库JanusGraph介绍及使用(一):简介
家辉自留地
07-06
2万+
图数据库JanusGraph介绍及使用(一):简介
作者:家辉,日期:2018-07-01 CSDN博客: http://blog.csdn.net/gobitan
说明:这是图数据库JanusGraph系列的第一篇,后面会陆续介绍。
图数据库JanusGraph介绍及使用(一):简介 https://blog.csdn.net/gobitan/article/details/8...
JanusGraph多实例问题
专注交流
08-07
1299
janusgraph默认一种存储后端是不是只会存一个graph实例?
不是
多实例操作代码:
mgmt = graph.openManagement()
mgmt.getOpenInstances();
mgmt.commit();
用这个语句查询所有打开的实例
那么怎么获取某一个实例呢?
不能,只可以关闭某个实例
ids = mgmt.getOpenInstances();
i...
JanusGraph实战笔记·数据写入·查询
专注交流
08-28
8564
Data Types·JanusGraph如何表示、写入和查询数组类型?
JanusGraph·How to represent, write or query an array in JanusGraph?
JanusGraph如何表示一个定点具有多个同名属性
JanusGraph定点的属性值不支持数组数据类型
collection的使用
If you are using Ela...
JanusGraph·上手JanusGraph
专注交流
07-30
3620
目录
图存储比较
社区
Install and Start gremlin.sh
图存储比较
titan 停止更新, janus 还未发布。
neo4j 单机性能超高,分布式瓶颈大。
中文入门资料
图数据库JanusGraph介绍及使用(一):简介 https://blog.csdn.net/gobitan/article/details/80939224
图数据库Ja...
JanusGraph 诸神图示例
O_n_O_的博客
09-14
3141
形成图谱如下:
源码:
import com.google.common.base.Preconditions;
import org.janusgraph.core.EdgeLabel;
import org.janusgraph.core.Multiplicity;
import org.janusgraph.core.PropertyKey;
import org.janusg...
助力泵嗡嗡响解决方法_怎么解决转向助力泵嗡嗡响
weixin_36234452的博客
01-12
2526
【太平洋汽车网】转向助力嗡嗡响是转向助力泵的原因,助力泵工作时产生的声音。存在异响就应该检查液压管路、泵体及方向机有无漏油现象,储液罐内液压油是否在上限与下限之间,传动带松紧适度是否正常,液压油有无变质。助力泵的工作原理,目前助力泵主要是方向助力泵和刹车真空助力泵,助力方式一般有机械助力、电子液压助力、电动助力。通过驾驶员打动方向盘或者踩下制动踏板发出信号时,行车电脑就会根据当前的车辆行驶状况(包...
电子助力方向机控制模块_电动转向助力系统的设置(功能校准)
weixin_39523529的博客
12-21
2964
在下列情况下,需要对电动转向助力系统进行设置(又称为功能校准):①对车桥进行过修理或调整。②拆卸并修理过转向柱。③更换转向控制模块并进行过编程。④更换动态稳定控制(ESP)模块并进行过编程。⑤调校过转向盘转向角传感器。⑥更换过转向器。⑦进行过四轮定位。③清除有关转向盘转向角传感器的故障码(如02546)。④在维修过程中断开过蓄电池电缆,或蓄电池的供电下面以大众汽车为例,说明电动转向助力系统的设置方...
Spark GraphX
赵英超的博客
06-21
1933
1、GraphX介绍1.1 GraphX应用背景Spark GraphX是一个分布式图处理框架,它是基于Spark平台提供对图计算和图挖掘简洁易用的而丰富的接口,极大的方便了对分布式图处理的需求。众所周知·,社交网络中人与人之间有很多关系链,例如Twitter、Facebook、微博和微信等,这些都是大数据产生的地方都需要图计算,现在的图处理基本都是分布式的图处理,而并非单机处理。Spark Gr...
深入理解深度学习——图嵌入(Graph Embedding)
冯·诺依曼
02-05
1万+
前面的文章介绍了由Word Embedding延伸出的Item Embedding等,这些延伸都建立在它们有序列特性的基础上。其实,可延伸的领域还有很多,有些初看起来与序列无关的领域,通过适当变化后,也同样适用。如下图所示,左边是人们在电商网站浏览物品的轨迹,这些轨迹呈图结构,通过一些算法计算后,可以把左图转换为右图这样具有序列样本特征的格式:
Graph Embedding与Word Embedding一样,目的是用低维、稠密、实值的向量表示网络中的节点。目前Gr
柔性下肢助力机器人
qq_43233389的博客
02-26
2011
外骨骼机器人的相关研究1.相关综述2.相关研究成果3.关键技术分析4.总结与展望
1.相关综述
柔性助力机器人可在一定程度上解决和避免助力外骨骼存在的人机关节难以对齐、附加质量大、步态不一致等问题 [16] . 国内外一些院校的实验室和
医疗机构相继开展了穿戴式柔性助力机器人的相关研究 , 研制了多种相关样机和产品 , 以增强腰部及下肢的肌肉力量、降低代谢消耗、延缓疲劳 , 如加拿大
皇后大学的 ...
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
©️2022 CSDN
皮肤主题:大白
设计师:CSDN官方博客
返回首页
weixin_33701564
CSDN认证博客专家
CSDN认证企业博客
码龄7年
暂无认证
148
原创
周排名
126万+
总排名
113万+
访问
等级
6953
积分
4011
粉丝
225
获赞
26
评论
1310
收藏
私信
关注
热门文章
09年最好看的电影大全_09年最经典的电影大全
57394
MySQL进行sum运算之后如何保留两位小数
16854
使用next.js完成从开发到部署
16830
【转载】Windows 10系统默认将画面显示比例调整至125%或150%,最高分辨率已经达到3840×2160(4K)这一级别。...
10211
用Kubeadm安装K8s后,kube-flannel-ds一直CrashLoopBackOff
8055
最新评论
T4312 最大出栈顺序
Xu_127:
其他样例过不了
AutoLISP对话框DCL控件属性
丶吟游诗人灬:
插眼
Python 爬虫 使用正则去掉不想要的网页元素
之乎Z也:
楼上的同行,可以把纠错贴出来
使用神经网络来拟合函数y = x^3 +b
锦帆远航:
为什么我的代码会报错:AttributeError: module 'tensorflow' has no attribute 'placeholder'
使用next.js完成从开发到部署
weixin_43021311:
想请问一下使用项目部署之后服务渲染的页面在刷新后包Internal Server Error是什么问题
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
matlab练习程序(共生矩阵)
Hash
额的神啊~~可爱的Visual Studio把项目模板扔了
2019年383篇
2018年706篇
2017年931篇
2016年547篇
2015年390篇
2014年304篇
2013年284篇
2012年273篇
2011年207篇
2010年145篇
2009年118篇
2008年90篇
2007年73篇
2006年37篇
2005年18篇
2004年11篇
2003年1篇
目录
目录
最新文章
matlab练习程序(共生矩阵)
Hash
额的神啊~~可爱的Visual Studio把项目模板扔了
2019年383篇
2018年706篇
2017年931篇
2016年547篇
2015年390篇
2014年304篇
2013年284篇
2012年273篇
2011年207篇
2010年145篇
2009年118篇
2008年90篇
2007年73篇
2006年37篇
2005年18篇
2004年11篇
2003年1篇
目录
评论
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。
余额充值