Code Monkey home page Code Monkey logo

rrdf's Introduction

About

Package to bring RDF and SPARQL functionality to R, using the Jena libraries (needs Java7 or higher).

java/ -> Helper classes for the R rdf package.
rdf/ -> R package for dealing with RDF, using Jena.
rrdflibs/ -> Jena libraries

Information about this package can be found in this preprint:

Willighagen E. (2014) Accessing biological data in R with semantic web
technologies. PeerJ PrePrints 2:e185v3

See https://dx.doi.org/10.7287/peerj.preprints.185v3

(Please cite this paper if you use this package.)

To cite a specific release, you can use these http://zenodo.org/ DOIs:

  • rrdf 2.1.2 DOI
  • rrdf 2.1.1 DOI

User mailing list

https://groups.google.com/forum/#!forum/rrdf-user

Copyright / License

rrdflibs package

Copyright (C) 2011-2015 Egon Willighagen and contributors

Apache License 2.0 for for the rrdflibs package files.

Copyright for Jena is described in the LICENSE and java/NOTICE files. Please also visit https://jena.apache.org/.

rrdf package

Copyright (C) 2011-2015 Egon Willighagen and contributors

License AGPL v3 for the rrdf package.

Authors / Contributors

Authors:

Egon Willighagen

Contributions from:

Carl Boettiger, Ryan Kohl

(See: https://github.com/egonw/rrdf/graphs/contributors)

Install from R

Previously, the packages were available from CRAN, but this is no longer the case.

Mind you, the below install_github() method will attempt to rebuild the vignette and therefore at this moment require a LaTeX distribution with pdflatex and a few packages installed. See also issue #28 and #29.

> install.packages("rJava") # if not present already
> install.packages("devtools") # if not present already
> library(devtools)
> install_github("egonw/rrdf", subdir="rrdflibs")
> install_github("egonw/rrdf", subdir="rrdf", build_vignettes = FALSE)

Compile from source

$ cd rrdf/java
$ groovy build.groovy
$ cd ../..
$ R CMD build rrdflibs
$ R CMD check --as-cran rrdflibs_1.4.0.tar.gz
$ R CMD build rrdf
$ tar xvf rrdf_2.0.4.tar.gz rrdf/inst/doc/tutorial.pdf
$ R CMD check --as-cran rrdf_2.0.4.tar.gz

Error Handling

In case of issues on Mac, follow the instructions below:

  • check that the $JAVA_PATH variable is correctly set. If not:
  1. Run touch ~/.bash_profile; open ~/.bash_profile in a Terminal window.
  2. add the following lines to your .bash_profile and then save: export JAVA_HOME=$(/usr/libexec/java_home) export LD_LIBRARY_PATH=/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/jre/lib/server export PATH=$PATH:$JAVA_HOME/bin
  3. Run source ~/.bash_profile in a terminal window.
  • check that that Java >=1.7 is installed in your system. If not, go to https://java.com/it/download/
  • check that R sees the latest Java version (.jinit();.jcall("java/lang/System", "S", "getProperty", "java.runtime.version")). If not [1,2]:
  1. Download and install Apple’s Java version 1.6 like you were asked to.
  2. Reconfigure your R installation by typing sudo R CMD javareconf in a Terminal window.
  3. Trigger a recompile by reinstalling rJava by typing install.packages('rJava', type='source').
  4. Run sudo ln -f -s $(/usr/libexec/java_home)/jre/lib/server/libjvm.dylib /usr/lib in a Terminal window.

rrdf's People

Contributors

cboettig avatar davideceolin avatar egonw avatar rlzijdeman avatar ryankohl avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

rrdf's Issues

appendTo param for load.rdf()

Allowing on the reduce the current set up:

alldata = combine.rdf(
alldata, load.rdf("names.n3", format="N3")
)

to:

load.rdf("names.n3", format="N3", appendTo=alldata)

Errors not always returned for BadURIException

Hi , I eventually got an error, which makes sense - but I didn't get it until a subsequent call? Not sure what causes the errors to bubble up; I was able to write N-TRIPLES and thought it was the format vs what was not getting returned

Error in .jcall("com/github/egonw/rrdf/RJenaHelper", "V", "saveRdf", store, :
com.hp.hpl.jena.shared.BadURIException: Only well-formed absolute URIrefs can be included in RDF/XML output: http://semanticweb.com/xxx/example#abc1234#6#8 Code: 0/ILLEGAL_CHARACTER in FRAGMENT: The character violates the grammar rules for URIs/IRIs.

closing , but providing for awareness

error processing vignette

Hi I tried to install the package using the instructions on github. The rrdflibs installed fine, but with the rrdf I get the following error message:

install_github("rrdf", "egonw", subdir="rrdf")
Installing github repo rrdf/master from egonw
Downloading master.zip from https://github.com/egonw/rrdf/archive/master.zip
Installing package from /var/folders/8w/60f85kqd1271y8bz6_k46pdr0000gn/T//RtmpH7nQjK/master.zip
arguments 'minimized' and 'invisible' are for Windows only
Installing rrdf
'/Library/Frameworks/R.framework/Resources/bin/R' --vanilla CMD build
'/private/var/folders/8w/60f85kqd1271y8bz6_k46pdr0000gn/T/RtmpH7nQjK/devtools1735799aad53/rrdf-master/rrdf'
--no-manual --no-resave-data

  • checking for file '/private/var/folders/8w/60f85kqd1271y8bz6_k46pdr0000gn/T/RtmpH7nQjK/devtools1735799aad53/rrdf-master/rrdf/DESCRIPTION' ... OK
  • preparing 'rrdf':
  • checking DESCRIPTION meta-information ... OK
  • installing the package to build vignettes
  • creating vignettes ... ERROR
    Loading required package: rJava
    Loading required package: rrdflibs

Error: processing vignette 'tutorial.Rnw' failed with diagnostics:
chunk 2
Error in .jcall("com/github/egonw/rrdf/RJenaHelper", "Lcom/hp/hpl/jena/rdf/model/Model;", :
RcallMethod: cannot determine object class
Execution halted
Error: Command failed (1)

Any idea here what could be causing this? Here's my sessionInfo():

sessionInfo()
R version 3.0.2 (2013-09-25)
Platform: x86_64-apple-darwin10.8.0 (64-bit)

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats graphics grDevices utils datasets methods base

other attached packages:
[1] devtools_1.5 rJava_0.9-6

loaded via a namespace (and not attached):
[1] digest_0.6.3 evaluate_0.4.3 httr_0.2 memoise_0.1 parallel_3.0.2
[6] RCurl_1.95-4.1 stringr_0.6.2 tools_3.0.2 whisker_0.3-2

Best wishes,

Richard

figure why this exception is not properly handeled

Error:

> test_check("rrdf")
log4j:WARN No appenders could be found for logger (org.apache.jena.riot.RDFLanguages).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
1. Error: a triple can be added with as a xsd:string ---------------------------
no method for coercing this S4 class to a vector
1: withCallingHandlers(eval(code, new_test_environment), error = capture_calls, message =     function(c) invokeRestart("muffleMessage"), 
       warning = function(c) invokeRestart("muffleWarning"))
2: eval(code, new_test_environment)
3: eval(expr, envir, enclos)
4: add.data.triple(store, subject = "http://example.org/Subject", predicate =     "http://example.org/Predicate", 
       data = "someName", type = "http://www.w3.org/2001/XMLSchema#string") at test-localStore.R:60
5: stop(exception)
6: .makeMessage(..., domain = domain)
7: lapply(list(...), as.character)
8: FUN(X[[1L]], ...)
9: as.character.default(X[[1L]], ...)
10: .handleSimpleError(function (e) 
   {
       e$calls <- head(sys.calls()[-seq_len(frame + 7)], -2)
       signalCondition(e)
   }, "no method for coercing this S4 class to a vector", quote(as.character.default(X[[1L]], 
       ...)))

[1] "Number of triples: 0"
[1] "Number of triples: 1"
testthat results ================================================================
OK: 34 SKIPPED: 0 FAILED: 1

Code that triggers this:

  add.data.triple(store,
    subject="http://example.org/Subject",
    predicate="http://example.org/Predicate",
    data="someName",
    type="http://www.w3.org/2001/XMLSchema#string")

Java OutOfMemmoryError

Hi,

I understand this has nothing to do with the package but I'm trying to read a 500MB RDF file and I get an out of memory error. I've tried to increase the java memory to 8 GB:

options(java.parameters = "-Xmx8000m")`

But, that had no effect. Any ideas of how to get around this issue.

Thanks.

Carlos

check failure in CRAN package rrdf

This now gives

Name: construct.remote

Title: Run a SPARQL CONSTRUCT query on a SPARQL end point and

construct

a new model with the results.

Aliases: construct.remote

Keywords: RDF triple

** Examples

store = construct.remote("http://rdf.farmbio.uu.se/chembl/sparql",

  • paste(
  • "CONSTRUCT { ?instance a http://example.org/Article } ",
    
  • "WHERE { ?instance a http://purl.org/ontology/bibo/Article }",
    
  • "LIMIT 5"
    
  • ))
    Error in .jcall("com/github/egonw/rrdf/RJenaHelper", "Lcom/hp/hpl/jena/rdf/model/Model;", :
    HttpException: HttpException: 503 Service Temporarily Unavailable: HttpException: 503 Service Temporarily Unavailable

but 'temporary' has been going on for a week now, so that server is misconfigured at best.

Your code needs to be more robust: any example which needs an outside resource should be able to 'work' without error if it is unavailable.

Can we please have a working update ASAP.

rrdf package is removed from CRAN

"""
It has been brought to our attention that a number of CRAN packages contain jar files which appear not to be written by the author of the package, and without the corresponding Java sources. Let us remind you of the policies:

'The ownership of copyright and intellectual property rights of all components of the package must be clear and unambiguous (including from the authors specification in the DESCRIPTION file). Where code is copied (or derived) from the work of others (including from R itself), care must be taken that any copyright/license statements are preserved and authorship is not misrepresented.'

If the code compiled into a .jar was written by anyone else or you are not the copyright holder, this needs to be declared. [And 'see the documentation for the authors' does not suffice: an AUTHORS file may need to be used.]

'Source packages under an Open Source license must provide source or something which can easily be converted back to source (e.g., .rda files) for all components of the package (including for example PDF documentation, configure files produced by autoconf). For Java .class and .jar files, the sources should be in a top-level java directory in the source package (or that directory should explain how they can be obtained).'

Please check that packages
"""

puts Jena jars into a separate package

The usual recommendation would be to split the jars into a separate
package (e.g., rrdfjars) so that updating the package to change a few
lines of code would not consume another 10MB of CRAN disk space.

wrap Jena exceptions to be listed with warnings()

E.g.:

WARN main - An error occurred while attempting to read from http://purl.obolibrary.org/obo/clo/UBERON_import.owl. Msg was 'http://purl.obolibrary.org/obo/clo/UBERON_import.owl'.
com.hp.hpl.jena.shared.DoesNotExistException: http://purl.obolibrary.org/obo/clo/UBERON_import.owl
at com.hp.hpl.jena.rdf.arp.JenaReader.read(JenaReader.java:89)
at com.hp.hpl.jena.rdf.model.impl.ModelCom.read(ModelCom.java:187)
at com.hp.hpl.jena.util.FileManager.readModelWorker(FileManager.java:367)

load.rdf help should report all formats

It currently only reports one:

load.rdf package:rrdf R Documentation

Load RDF content

Description:

 Loads triples from a RDF serialization.

Usage:

 load.rdf(filename, format = "RDF/XML", appendTo=NULL)

Arguments:

filename: Name of the file to read the triples from.

format: Format of the RDF file, e.g. RDF/XML.

appendTo: Optional Java Model object to which read statements are
added.

Value:

 A Java Model object containing the triples loaded from the file.

Author(s):

 Egon Willighagen

Examples:

 ## Not run: model = load.rdf("someFile.xml", "RDF/XML")
 ## Not run: model = new.rdf(ontology=FALSE)
 ## Not run: load.rdf("someFile.xml", "RDF/XML", model)

Replace use of is.null() by missing()

Orginally reported by Maarten-Jan Kallen on rOpenSci for one method (that one actually is applied, but there is more such use):

No, you should just do

add.prefix <- function(store, prefix, namespace) {
      if (missing(store)) stop("A store must be given.")
      if (missing(prefix)) stop("A prefix must be given.")
      if (missing(namespace)) stop("A namespace must be given.")
# ...
}

Unfortunately, the original bug report is lost.

problem with using aggregate function with sparql.remote

Reported in a private email:

"I am trying use the sparql.remote function in the rrdf package to retrieve a count of patients in my triple store (an OWLIM-SE repository).
My query looks like this:

patient_count <-
"PREFIX rdfs: http://www.w3.org/2000/01/rdf-schema#
SELECT (count(distinct ?patientid) as ?count)
WHERE {
?patienttype rdfs:subClassOf http://purl.obolibrary.org/obo/OHD_0000012 .
?patienti http://purl.obolibrary.org/obo/OHD_0000092 ?patienttype .
?patienti rdfs:label ?patientid .
} "

When run the query, I get the following error:

sparql.remote(owlim_se_r21, patient_count)

error-message
[1,] "Encountered "" at line 9, column 10.\nWas expecting one of:\n "(" ...\n "exists" ...\n "not exists" ...\n "str" ...\n "lang" ...\n "langmatches" ...\n "datatype" ...\n "bound" ...\n "sameTerm" ...\n <IS_IRI> ...\n "isBlank" ...\n "isLiteral" ...\n "isNumeric" ...\n "coalesce" ...\n "bnode" ...\n "strdt" ...\n "strlang" ...\n ...\n "if" ...\n "regex" ...\n "strlen" ...\n "substr" ...\n "strStarts" ...\n "strEnds" ...\n "strBefore" ...\n "strAfter" ...\n "replace" ...\n "ucase" ...\n "lcase" ...\n "concat" ...\n "contains" ...\n "encode_for_URI" ...\n "rand" ...\n "abs" ...\n "ceil" ...\n "floor" ...\n "round" ...\n "now" ...\n "year" ...\n "month" ...\n "day" ...\n "hours" ...\n "minutes" ...\n "seconds" ...\n "timezone" ...\n "tz" ...\n "md5" ...\n "sha1" ...\n "sha224" ...\n "sha256" ...\n "sha384" ...\n "sha512" ...\n <Q_IRI_REF> ...\n <PNAME_NS> ...\n <PNAME_LN> ...\n ...\n ..."

This query string works with other sparql packages (e.g., SPARQL). Am I doing something wrong?"

Typo in rrdf/R/add.data.triple.R - dataTyime should be dateTime

diff --git a/rrdf/R/add.data.triple.R b/rrdf/R/add.data.triple.R
index 4138206..51ba8d1 100644
--- a/rrdf/R/add.data.triple.R
+++ b/rrdf/R/add.data.triple.R
@@ -28,7 +28,7 @@ add.data.triple <- function(store,
                    "normalizedString", "string", "token", "byte", "decimal", "float",
                    "int", "integer", "long", "negativeInteger", "nonNegativeInteger",
                    "nonPositiveInteger", "positiveInteger", "short", "unsignedByte",
    -                       "unsignedInt", "unsignedLong", "unsignedShort", "date", "dataTyime",
    +                       "unsignedInt", "unsignedLong", "unsignedShort", "date", "dateTime",
                    "duration", "gDay", "gMonth", "gMonthDay", "gYear", "gYearMonth",
                    "time")
            if (!(type %in% types))

Support for Sparql Construct

It would be nice if there was support for Sparql Construct statements in the library, so that graphs could be extracted, fiddled with, and merged together.

return empty columns with sparql.remote

Reported in a private email:

"Is it possible to have sparql.remote return empty column names with an "" in the column?

Currently if the query doesn't find a value, the column is not return."

Unable to load data in R

Dear Egon,

thanks a lot for the package rrdf.

As I am really new to the package and the concept of RDF in general I am facing some issues in loading RDF-data into R.
After installing the package in R (which was a little bit of a hastle, but in the end I got it working) I have problems loading RDF-data into R.
I use following commands:
library("rrdf")
endpoint = "http://www.bcn.cat/tercerlloc/educacio.rdf"
query <- "SELECT * {};"
data <- sparql.remote(endpoint, query)

Unfortunately the result was following warning:
Warning message: In .jcall("com/github/egonw/rrdf/RJenaHelper", "Lcom/github/egonw/rrdf/StringMatrix;", : com.hp.hpl.jena.sparql.resultset.ResultSetException: Failed when initializing the StAX parsing engine

Do you have any idea what is the reason for that?
Would be great if you could provide some further assistance. I feel I got stuck a few steps before the finish line and I would be very grateful, if you could push me over the line.

Thanks,
Magnus

not available from CRAN!

R version 2.11.1 (2010-05-31)
Copyright (C) 2010 The R Foundation for Statistical Computing
ISBN 3-900051-07-0

....

install.packages(pkgs=c("rrdflibs", "rrdf"))
Warning in install.packages(pkgs = c("rrdflibs", "rrdf")) :
argument 'lib' is missing: using '/Users/arademaker/Library/R/2.11/library'
--- Please select a CRAN mirror for use in this session ---
Loading Tcl/Tk interface ... done
CRAN mirror

...

Selection: 79
Warning message:
In getDependencies(pkgs, dependencies, available, lib) :
packages ‘rrdflibs’, ‘rrdf’ are not available

Let me know my mistake and congratulations. I was planning to develop something similar.

compile error on Mac

See:

http://www.r-project.org/nosvn/R.check/r-release-macosx-ix86/rrdf-00check.html

checking examples ... ERROR
Running examples in 'rrdf-Ex.R' failed
The error most likely occurred in:

Name: add.data.triple

Title: Add an data property to the model.

Aliases: add.data.triple

Keywords: data predicate triple

** Examples

store = new.rdf()
Error in .jcall("com/github/egonw/rrdf/RJenaHelper", "Lcom/hp/hpl/jena/rdf/model/Model;", :
RcallMethod: cannot determine object class
Calls: new.rdf -> .jcall -> .External
Execution halted

jars in inst/java

Also, you may find it more convenient to use inst/java for the jars.

test with R 2.15.2

@sandsfish wrote: "I'm trying to use the excellent 'rrdf' package, but get "package ‘rrdf’ is not available (for R version 2.15.2)" Thoughts?"

result rows may be missing, out of order

The issue is that in convertIntoTable, the varNames are taken from the QuerySolution. But suppose you have selected from a variable that has no bindings for the query. Then it will not be included in the results that are provided because it is in no solution. Also, the ordering of variables is not guaranteed in the QuerySolution instances. Instead use the varnames parsed from the XML head element.

    List<String> varnames = results.getResultVars();

private static StringMatrix convertIntoTable(
PrefixMapping prefixMap, ResultSet results) {
StringMatrix table = new StringMatrix();
int rowCount = 0;
--> List resultVarNames = results.getResultVars()
while (results.hasNext()) {
rowCount++;
QuerySolution soln = results.nextSolution();

not this:
Iterator varNames = soln.varNames();
instead:
Iterator varNames = resultVarNames.iterator();

Look into renjin support

@mj_kallen wrote on Twitter:

"""@egonwillighagen you already have the Jena helper class so you would just need to replace the .jcall calls."""

This options the possibility to update rrdf to support both GNU R and Renjin.

Unsupported major.minor version 51.0

Hi,

I'm trying to run the examples from the sparql.remote help page, but in both cases I am treated to a warning and get no output:
"In .jcall("com/github/egonw/rrdf/RJenaHelper", "Lcom/github/egonw/rrdf/StringMatrix;", :
java.lang.UnsupportedClassVersionError: com/github/egonw/rrdf/RJenaHelper : Unsupported major.minor version 51.0"

I'm not sure what that means. Any ideas how I can resolve it?

Best,

Richard

fault format reporting

data = load.rdf("citograph.ttl", format="N/TRIPLES")
Error in load.rdf("citograph.ttl", format = "N/TRIPLES") :
Formats must be one in: RDF/XMLTURTLEN-TRIPLESN3

Upgrading Jena libraries

Hey Egon,
I've been trying to build rrdf with a newer version of Jena (to get better SPARQL support), but I've been running into problems with the build. rrdflibs builds just fine, but when I run
R CMD check rrdf
I get back a NoClassDefFoundError: org/w3c/dom/ElementTraversal
and I haven't found a way around it. The only change I made was to rrdflibs.R, where the jenaJars array was changed to
"commons-codec-1.5.jar", "jena-tdb-0.9.4.jar",
"httpclient-4.1.2.jar", "log4j-1.2.16.jar",
"httpcore-4.1.3.jar", "slf4j-api-1.6.4.jar",
"jcl-over-slf4j-1.6.4.jar", "slf4j-log4j12-1.6.4.jar",
"jena-arq-2.9.4.jar", "xercesImpl-2.10.0.jar",
"jena-core-2.7.4.jar", "xml-apis.1.4.01.jar",
"jena-iri-0.9.4.jar"
(using the apache jena 2.7.4 build from last Fall at http://archive.apache.org/dist/jena/binaries/apache-jena-2.7.4.tar.gz)

Any ideas why the dependency isn't being picked up? I assume it's got something to do with the xercesImpl and xml-apis jars, but I've hit a wall. I also unsuccessfully tried the latest 2.10.1 release.

NAMESPACE file missing

As reported by "R CMD check":

As from R 2.14.0 all packages need a namespace.
One will be generated on installation, but it is better to handcraft a
NAMESPACE file: R CMD build will produce a suitable starting point.

error in summarize help

Sorry for the late reply. I got round to playing with the rrdf package. But I see an error from the code you provided in test.R:

m3 = summarize.rdf(m1, m2)
Error in summarize.rdf(m1, m2) : unused argument(s) (m2)

Error in .jinit() : cannot obtain Class.getSimpleName method ID

Having an issue loading rrdf, as the .jinit() call fails as follows:

library(rrdf)
Loading required package: rrdflibs
Error in .jinit(classpath = c(paste(lib, pkg, "java", "arq-2.8.7.jar", : cannot obtain Class.getSimpleName method ID
Error: package 'rrdflibs' could not be loaded

I suspected this to be an issue with rJava and posted the issue on their Bugzilla tracker.

(Kindly refer to this rJava Bugzilla thread: https://www.rforge.net/bugzilla/show_bug.cgi?id=223)

But the developer quotes: "Finally, packages should NOT call .jinit so that is a bug in rrdf - please use .jpackage instead. I would uggest discussing it on the mailing list as this doesn't look like rJava bug so far."

Passing along this issue to you, as I'm not 100% sure where the actual issue lies based on this conversation.

Any thoughts would be much appreciated.

Thanks!

Better error message when a remote SPARQL end point is down

From email:

endpoint <- "http://rdf.farmbio.uu.se/chembl/sparql"

test_query <- "

data = sparql.remote(endpoint, test_query)
Warning message:
In .jcall("com/github/egonw/rrdf/RJenaHelper", "Lcom/github/egonw/rrdf/StringMatrix;", :
com.hp.hpl.jena.sparql.resultset.ResultSetException: Not an ResultSet result

The SPARQL end point was down at the time.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.